带行号的 Grep
要显示包含字符串的行号,请使用 -n 开关:
$ grep -n string filename
使用正则表达式grep
通过使用正则表达式进一步扩展了 Grep 的功能,使搜索更加灵活。
[ ] 括号用于匹配任何一组字符。
$ grep "Class [123]" Students.txt
此命令将返回任何表示“Class 1”、“Class2”或者“Class 3”的行。
[-] 带连字符的括号可用于指定字符,数字或者字母的范围。
$ grep "Class [1-3]" Students.txt
^ 插入符号用于搜索仅出现在行首的模式。
$ grep "^Class" Students.txt
[^] 带插入符号的括号用于从搜索模式中排除字符。
$ grep "Class [^1-2]" Students.txt
$ 美元符号用于搜索仅出现在行尾的模式。
$ grep "1$" Students.txt
. 点号 用于匹配任何一个字符,因此它是一个通配符,但仅适用于单个字符。
$ grep "A….a" Students.txt
或者条件
搜索string1或者string2
$ grep -E 'string1|string2' filename
$ egrep 'string1|string2' filename
Grep 是 Linux 用户用来搜索文本字符串的命令行工具。
查找多个字符串
我们还可以使用 grep 查找多个单词或者字符串。
使用-e开关指定多模式搜索
$ grep -e 'Class 1' -e Todd Students.txt
只需要在包含空格的字符串中使用引号。
排除模式
我们可以使用 -v 开关 排除匹配的行。
$ grep -v string-to-exclude filename
Grep 精确匹配
在上面的示例中,每当我们在文档中搜索字符串“apple”时,grep 也会返回“pineapple”分。
为了避免这种情况,并严格搜索“apple”,我们可以使用以下命令:
$ grep "\<apple\>" fruits.txt
我们还可以使用 -w 开关,它会告诉 grep 字符串必须匹配整行。
不解压,直接搜索gz文件
我们可以使用 zgrep 命令搜索压缩文件,而无需先解压缩它们。
$ zgrep word-to-search /path/to/file.gz
我们还可以使用 zcat 命令显示 gz 文件的内容,然后将该输出通过管道传送到 grep 以隔离包含搜索字符串的行。
$ zcat file.gz | grep word-to-search
递归搜索
我们可以将 -r 开关与 grep 一起使用,以递归方式搜索目录及其子目录中的所有文件以查找指定模式。
$ grep -r pattern /directory/to/search
如果我们不指定目录,grep 将只搜索我们当前的工作目录。
Grep 电子邮件地址
我们可以使用正则表达式从 zip 文件中提取所有电子邮件地址。
$ grep -o '[[:alnum:]+\._\-]*@[[:alnum:]+\._\-]*' emails.txt
-o 标志将仅提取电子邮件地址,而不是显示包含电子邮件地址的整行。
这会导致更清晰的输出。
查找字符串
搜索My Documents文件
$ ls | grep 'My Documents'
如果字符串包含空格,需要使用引号引起来, Grep 接受单引号和双引号。
搜索文件内容中的字符串:
$ grep 'Class 1' Students.txt
Grep IP 地址
以下命令将仅查找并隔离有效的 IPv4 地址:
$ grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" /var/log/auth.log
忽略大小写
默认情况下,grep 区分大小写,这意味着我们必须精确地确定搜索字符串的大小写。
我们可以通过使用 -i 开关告诉 grep 忽略大小写 。
$ grep -i string filename
显示前后行
如果我们需要更多关于 grep 输出的上下文,我们可以使用 -c 开关在指定的搜索字符串前后显示一行:
$ grep -c 1 string filename
grep、egrep fgrep、pgrep、zgrep的区别
egrep 相当于 grep -E
设置为扩展正则表达式模式。
搜索包含两个连续“p”字母的字符串
$ egrep p\{2} fruits.txt
或者
$ grep -E p\{2} fruits.txt
fgrep 相当于 grep -F
此开关将模式解释为固定字符串的列表,并尝试匹配其中任何一个字符串。当您需要搜索正则表达式字符时,它非常有用。这意味着你不必像普通grep那样转义特殊字符。
pgrep
pgrep是一个命令,用于搜索系统上正在运行的进程的名称并返回其各自的进程ID。例如,您可以使用它来查找SSH守护进程的进程ID:
$ pgrep sshd
类似于将“ps”命令的输出通过管道传递给 grep。
zgrep
您可以使用 zgrep 搜索压缩文件中的模式。 它允许您搜索压缩档案中的文件,而无需先解压缩该档案,基本上可以节省一两个另外的步骤。
$ zgrep apple fruits.txt.gz
zgrep 也适用于 tar 文件,但似乎只能告诉我们它是否能够找到匹配项。
find 和 grep 的区别
当我们使用 grep 搜索 ls 命令的输出时,使用 grep 查找文件很方便
但是,如果我们需要递归搜索文件名——或者如果使用通配符(星号)搜索文件名的一部分——那么使用“find”命令就更容易了。
$ find /path/to/search -name name-of-file
find 命令能够成功定位到我们搜索的文件。
捕获空格或者制表符
在引号内放置一个或者多个空格,以便 grep 搜索该字符。
$ grep " " sample.txt
搜索制表符最简单的方法,是使用ctrl+v从其他地方粘贴tab制表符:
$ grep " " sample.txt