用grep在文件中搜索文本

上一篇 / 下一篇  2015-06-03 14:09:05 / 个人分类:linux

用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键。


TAG:

 

评分:0

我来说两句

Open Toolbar