使用grep,egrep和fgrep命令在文件中查找文本
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"。