彻底理解grep命令
1.1 grep命令简介
grep (global search regular expression(RE) and print out the line,是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。
1.2 grep工作过程
grep命令将逐行读入文件内容至模式空间,按照给定的pattern进行匹配。
- 如果该行内容能够被指定的pattern匹配,复制该行内容到标准输出,并且读入文件的下一行。
- 如果该行内容不能被指定的条件匹配,删除此行,读取下一行内容。
- 对于匹配结果来说,grep默认工作在贪婪模式下,会对符合匹配结果的字符串尽可能长的匹配。匹配的一行内容中可能出现整个字符串是不符合匹配结结果的,但这个字符串部分内容又能够被匹配到。
1.3 grep语法格式:
grep [options] pattern input_file_names
选项可以有零个或多个。
--color=auto: 对匹配到的文本着色显示
-m # 匹配#次后停止
-v 显示不被pattern匹配到的行
-I 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系
-w 匹配整个单词
-E 使用扩展正则表达式
-F 相当于fgrep,不支持正则表达式
-f file 根据模式文件处理
1.4 grep示例
- grep查找ssh相关进程,结果中为什么存在有grep进程出现呢?
[19:58:31 root@centos7 /]#ps aux | grep sshd
root 6971 0.0 0.2 112756 4304 ? Ss 08:43 0:00 /usr/sbin/sshd -D
root 7393 0.0 0.2 160848 5732 ? Ss 08:44 0:09 sshd: root@pts/1,pts/2
root 15188 0.0 0.0 112712 976 pts/1 S+ 20:00 0:00 grep --color=auto sshd
这是由于管道实现的是进程之间的通信,管道右边进程在ps进程启动后也会启动,它们之间的进程存在交集状态。
- grep会对行中符合匹配标准的结果尽可能长的匹配,最终结果可能会发现整个字符串是不符合匹配条件的,但这个字符串部分是符合的。
[20:25:07 root@centos7 tmp]#cat reg.txt
12 goo oogle google
ggole goo00le googlegoogl
root root googlelegoo rot
rotroot rootrot
[20:31:22 root@centos7 tmp]#egrep "rot|root" reg.txt
root root googlelegoo rot
rotroot rootrot
grep命令只要明白了它的工作模式,其他的都不复杂。它选项众多,只要记住常用的就行。