使用grep,egrep和fgrep命令在文件中查找文本

时间:2019-04-29 03:17:27  来源:igfitidea点击:

grep是使用正则表达式在单个或多个文件中搜索文本的最有用的程序之一。grep程序有几个变种。

fgrep:这是一个不支持正则表达式的简化版本。fgrep仅限用于字符串。有点就是它非常快。

egrep:这个版本确实支持正则表达式,但是它在操作上更慢,内存消耗更大。

grep:这是Linux的默认文本搜索工具。它速度很快,并且可以处理正则表达式。

grep语法至少需要一个正则表达式才能搜索。通常,其后是一个或多个要搜索的文本文件。如果未指定文件,则grep将默认为标准输入。除了正则表达式和文件名之外,还可以从命令行传递各种其他选项。一些常用的选项:

grep选项:

参数描述结果
-c计数输出匹配行数。
-i忽略大小写忽略字母大小写
-l列表仅输出匹配文件的名称
-n数字在匹配的输出中包括行号
-r递归也在子目录中搜索
-v倒置输出与正则表达式不匹配的行
-f文件文件选项,用于可以从文件中读取的模式

grep基本示例

/etc/passwd文件中搜索字符串john

john@john-desktop:~$ grep john /etc/passwd
john:x:1000:1000:john,,,:/home/john:/bin/bash

使用-i选项搜索时忽略字符串大小写。

john@john-desktop:~$ grep -i JOHN /etc/passwd
john:x:1000:1000:john,,,:/home/john:/bin/bash

递归地搜索文件和目录,查找给定的字符串。然后我们应用-i选项来忽略大小写。

john@john-desktop:~/test_examples$ ls -l
total 20
-rwxrwxrwx 1 john john   19 Jan 23 09:51 file1.txt
-rwxrwxrwx 1 john john   19 Jan 23 09:51 file2.txt
-rwxrwxrwx 1 john john   19 Jan 23 09:59 file3.txt
-rwxrwxrwx 1 john john   19 Jan 23 10:00 file4.txt
drwxrwxr-x 2 john john 4096 Jan 23 10:04 testdir
john@john-desktop:~/test_examples$ grep -r "some" .
./file2.txt:some text in file2
./file3.txt:somewhere in file3
./file1.txt:some text in file1
john@john-desktop:~/test_examples$ grep -ir "some" .
./testdir/file5.txt:Somewhere in file5
./file4.txt:Somewhere in file4
./file2.txt:some text in file2
./file3.txt:somewhere in file3

使用-w选项来搜索整个单词。在本例中,我们在文件 file1.txt, file2.txt, file3.txt 和 file4.txt中搜索整个text。请注意在文件名[1-4]中使用了范围。

john@john-desktop:~/test_examples$ grep -w "text" file[1-4].txt
file1.txt:some text in file1
file2.txt:some text in file2

使用egrep搜索多个单词。

john@john-desktop:~/test_examples$ egrep -iw "text|some" file[1-4].txt
file1.txt:some text in file1
file2.txt:some text in file2

使用-c选项记录模式匹配的次数
在本例中,我们运行了两次命令。这样就可以看到,在添加了另一行包含指定单词的文本后,计数是如何递增的。

john@john-desktop:~/test_examples$ grep -c "some" file1.txt
1
john@john-desktop:~/test_examples$ echo "some other line" >> file1.txt
john@john-desktop:~/test_examples$ grep -c "some" file1.txt 
2

使用-n选项添加匹配的行号

john@john-desktop:~/test_examples$ grep -n "some" file1.txt
1:some text in file1
2:some other line

只列出匹配的文件名。对列表使用-l选项。

john@john-desktop:~/test_examples$ grep -l 'some' *.txt .
file1.txt
file2.txt
file3.txt

grep和正则表达式

什么是正则表达式?

正则表达式是一种描述命令文本的有效方法。这里介绍一些最常用的表达式。在其中一些中,您已经遇到了find命令。

最简单的形式"a"是一个与字符"a"匹配的正则表达式。

"abc"匹配字符串"abc"。

[a-c]从"a"到"c"只匹配一个字符。

a[bc]d与"abd"或"acd"匹配。

[A-Za-z]匹配所有大写和小写字母。

[^abc]匹配除"a"、"b"或"c"之外的所有字符。注意,在shell中我们使用[!abc]。

点"."和shell中的"?"是等价的。只匹配一个除了"\n"换行符之外的字符。

^只匹配一行的开头。

$只匹配行尾。

*匹配任何东西或任何东西。

\<匹配一个单词的开头。

\>匹配一个单词的结尾。

|允许多个选项。例如red(car|hat|book)"可以与"redcar"、"redhat"或"redbook"相匹配。

?这是一个可选的表达式,表示它必须至少出现一次或根本不出现。例如 "red(hat)?"匹配"red"或者"redhat"。