用grep在文件中搜索文本
grep命令是UNIX中用于文本搜索的大师级工具。搜到结果。如在文件中搜索一个单词:
$ grep match_pattern filename
或者:
$ grep “match_pattern” filename
也可以像下面这样从stdin中读取:
$ echo –e “this is a word\nnextline” | grep
word
This is a word
一个grep命令也可以对多个文件进行搜索:
$ grep “match_text” file1 file2 file3 …
用--color选项可以在输出行中重点标记出匹配到的单词,如:
$ grep word filename –color=auto
grep命令通常将match_pattern视为通配符。如果要使用正则表达式,需要添加-E选项——这意味着使用扩展(extended)正则表达式,也可以使用默认允许正则表达式的grep命令——egrep。例如:
$ grep –E “[a-z]+”
或者:
$ egrep “[a-z]+”
为了只输出文件中匹配到的文本部分,可以使用选项-o,如:
$ echo this is a line. | grep –o –E
“[a-z]+\.”
line.
$ echo this is a line. | egrep –o “[a-z]+”
this
is
a
line
选项-P可以支持Perl风格的match_pattern,如:
$ echo –e “a\tb” | grep –P “\t”
a b
选项-v可以将匹配结果进行反转(invert),即要打印除包含match_pattern的行之外的所有行:
$ grep –v match_pattern file
选项-c可以统计匹配行的数量(注意并不是匹配的次数),如:
$ echo –e “1 2 3 4\nhello\n5 6” | egrep –c
“[0-9]”
2
为了统计文件中匹配项的数量,可以使用下面的技巧:
$ echo –e “1 2 3 4\nhello\n5 6” | egrep –o “[0-9]” | wc
–l
6
选项-n可以打印出匹配字符串的行号:
$ echo –e “1 2 3 4\nhello\n5 6” | egrep –n
“[0-9]”
1: 1 2 3 4
3: 5 6
选项-b可以打印样式匹配所位于的字符或字节偏移,如:
$ echo gnu is not unix | grep –b –o “not”
7: not
选项-l可以搜索多个文件并找出匹配文本位于哪一个文件中,如:
$ grep –l linux sample1.txt sample2.txt
sample1.txt
Sample2.txt
选项-L与选项-l相反,返回一个不匹配的文件列表。
-R选项可以对文本进行递归搜索,如要查找某个文本”text”位于哪个文件的第几行,可用:
$ grep “text” . –R –n
-i选项可以忽略样式中的大小写,例如:
$ echo hello work | grep –I “HELLO”
Hello world
在进行匹配的时候通常只指定一个样式。我们可以用选项-e来指定多个匹配样式,如:
$ echo this is a line of text | grep –e “this” –e “line”
–o
this
line
还有另一种方法也可以指定多个样式。我们可以提供一个样式文件用于读取样式。在样式文件中逐行写下需要匹配的样式,然后用选型-f执行grep:
$ grep –f pattern_file source_filename
grep命令在搜不到结果的时候返回代码是1,而不是0,另外grep命令还有-q(静默输出)选项,它仅运行命令,返回命令的返回值,而不会向标准输出打印任何输出,配合这个选项,可以测试一个文件是否包含指定的文本。
grep命令还可以打印出匹配文本之前或之后的行
-A选项匹配某个结果之后的x行:
$ seq 10 | grep 5 –A 3
5
6
7
8
-B选项匹配某个结果之前的x行:
$ seq 10 | grep 5 –B 3
2
3
4
5
-C选项匹配某个结果之前及之后的3行:
$ seq 10 | grep 5 –C 3
2
3
4
5
6
7
8
如果有多个匹配,那么以一行”—“作为各匹配之间的定界符:
$ echo –e “a\nb\nc\na\nb\nc” | grep a –A 1
a
b
--
a
b
另外,grep “\t”是不行的,需要输入一个真正的制表符,方法为先按Ctrl+V,再按TAB键。