跳转到内容

LPI Linux 认证/使用正则表达式搜索文本文件

来自维基教科书,开放的书本,为开放的世界

详细目标

[编辑 | 编辑源代码]

(LPIC-1 版本 5.0)

权重:2

描述
考生应该能够使用正则表达式来操作文件和文本数据。本目标包括创建包含多个符号元素的简单正则表达式,以及理解基本正则表达式和扩展正则表达式之间的区别。它还包括使用正则表达式工具在文件系统或文件内容中执行搜索。

关键知识领域

  • 创建包含多个符号元素的简单正则表达式。
  • 了解基本正则表达式和扩展正则表达式之间的区别。
  • 了解特殊字符、字符类、量词和锚的概念。
  • 使用正则表达式工具在文件系统或文件内容中执行搜索。
  • 使用正则表达式删除、更改和替换文本。

以下是使用的文件、术语和实用程序的列表

  • grep
  • egrep
  • fgrep
  • sed
  • regex(7)

模式匹配

[编辑 | 编辑源代码]

有两种模式匹配

  • 通配符(文件名生成)
  • 正则表达式

通配符主要应用于当前目录或子目录中使用时。当通配符 *, ?, [ - ], ~ 和 ! 在正则表达式中使用时,它们不再生成文件名。

使用正则表达式的一些实用程序是

  • grep, egrep
  • vi
  • more
  • sed
  • Perl

所有能够使用正则表达式的实用程序使用的有限正则表达式搜索模式。

  • 任意一个字符 . Ab.a Abla 或 Abca
  • 一个字符集 [ ] Ab[sd]a Absa 或 Abda 仅此而已
  • 一个字符范围 [ - ] Ab[a-z]a Abaa 或 Abba 或 ...
  • 不在集合中 [^ ] Ab[^0-9]a Abaa 或 Abba 或 ...
  • 零个或多个 * Ab*a Absala 或 Aba 或 ...
  • 行首 ^ ^Aba 行首>Aba
  • 行尾 $ Aba$ Aba<行尾
  • 字面量 \ Aba\$ Aba$

例子

Ab[0-3]s
^Ab\^bA
[01]bin$
^..\\
[^zZ]oro

所有使用正则表达式的实用程序使用的有限正则表达式组合。

  • 任何字符串 .* Ab.*a Abrahma 或 Abaa 或 ...
  • 从 [ ]* th[aersti]* 开始的字符串 There 或 This 或 ...
  • 多范围 [ - - ] Ab[0-2][a-c]a Ab0aa 或 Ab1aa 或 ...
  • 匹配 \ \\ \\[a-zA-Z]* \Beethoven

示例

Ab[0-3][a-z]s
...$
^[01]\^2
[0-9][a-z] \$
[a-zA-Z]*
^[^c-zC-Z]*
^[a-zA-Z0-9]$

修饰符模式 替换由正则表达式模式匹配的字符串

  • 匹配 m \{m\} b[0-9]\{3\} b911
  • 一个或多个 \{m,\} b[0-9]\{2,\} b52
  • 最多 n \{m,n\} b[0-9]\{2,4\} b1234
  • 单词开头 \< \<wh where
  • 单词结尾 \> [0-9]\> bin01

要查找文件中的文本,请使用 grep。

grep [options] [string] [files]

最好引用字符串以防止误解。

常见选项

  • -i: 忽略大小写
  • -E: 扩展,使用正则表达式
  • -l: 仅在至少有一个匹配项时列出文件名
  • -c: 仅显示匹配行的计数
  • -n: 也显示行号
  • -v: 不匹配。

示例

grep host /etc/*.conf
grep -l '\<mai' /usr/include/*.h
grep -n toto /etc/group
grep -vc root /etc/passwd
grep '^user' /etc/passwd
grep '[rR].*' /etc/passwd
grep '\<[rR].*' /etc/passwd

要对流应用命令,请使用 sed。

sed [address1][,address2][!]command[options] [files...]

sed 程序将从文件中的 address1 到 address2 应用命令。address1 和 address2 格式是正则表达式。

sed 程序是一个非交互式编辑工具。

示例

sed '1,3s/aa/bb/g' file               # Replace in file from lines 1 to 3 'aa' with 'bb'.
sed '/here/,$d' file                  # Delete line from here to the end.
sed '/here/d' file                    # Delete lines including the word 'here'.
sed '1,/xxx/p' file                   # Print lines 1 to xxx.
sed '/ll/,/ff/!s/maison/house/g' file # In file replace words 'maison' with 'house' excluding lines from ll to ff.
  1. 处理你的 bookmarks.html 文件以生成一个文件 mywebsites.txt,其中只包含网站的标题。
  2. 将 /etc 中的所有文件复制到你的 home 目录中的 etc/。通过将 'host' 替换为 'machine' 来显示所有 *.conf 文件的内容。
  3. 显示所有不包含 'root' 字样的 *.conf 文件的内容。使用 grep 和 sed 的命令是什么?
  4. 打印出 root 所属的所有组名。
  5. 列出所有长度为 4 或 5 个字符的组名。
  6. 列出所有包含没有空格的字符行(空行)的文件。
  7. 在 etc/ 目录中列出所有包含数字字符的文件。
  8. 使用 ls 仅打印 / 中的目录名。
  9. 执行“ps -aux”并将用户 r_polto 替换为 root,并将其打印到名为 new_process.txt 的文件中。
  10. 列出所有由以“p”或“P”开头的用户名拥有的名为 'apache' 的进程。


华夏公益教科书