先来小菜一碟:
cat /etc/passwd | grep -c "/bin/bash$"
以上,用来统计/etc/passwd 文件中以/bin/bash结尾的用户个数。
grep用来基于正则去实现行过滤的工具;它有很多衍生命令:
egrep 扩展的grep,即默认使用扩展正则表达式的grep,更高级。
fgrep 专用于文件行过滤的工具。
grep命令格式:grep [option] pattern file option表示选项,pattern 表示要匹配的模式,file表示要查询的文件名
grep命令的常用选项:
-E 开启扩展正则模式,相当于使用egrep命令
-F 关闭正则表达式,将PATTERN看做字符串直接匹配
-G 默认,开启基本正则表达
-P 开启perl兼容正则模式,利用perl语言中的正则匹配,表示我不会,因此不涉及
以上,属于pattern匹配方式的选择————————————————————
-e 该选项针对"-",由于grep默认不支持pattern中包含"-" 的匹配。使用-e可以避免报错。
-f 将PATTERN写入指定文件,通过该选项,可调用文件中的PATTERN去匹配目标文件
-i 匹配时,忽略大小写进行
-v 排除PATTERN,显示剩余没有被匹配到的内容行
-w 将PATTERN视为一个单词(前后不是非字母就是一个结束),相当于PATTERN中加入了 " \bPATTERN\b"去定界。
-x 当PATTERN匹配了整行内容时,才输出到屏幕;如
[root@localhost tmp]# cat /etc/passwd |grep "^root"
root:x:0:0:root:/root:/bin/bash
[root@localhost tmp]# cat /etc/passwd |grep -x "^root"
[root@localhost tmp]# cat /etc/passwd |grep -x "^root.*"
root:x:0:0:root:/root:/bin/bash
以上是帮助PATTERN提高性能的选项——————————————————
-c PATTERN成功匹配到内容的次数
--color= 设置高亮方式,可以用{never|always|auto} 来实现
-L 当grep目标文件是多个文件时,结果会输出“文件名:匹配行内容”的形式。-L则只将不包含匹配行的文件名输出。和-v类似。
-R 递归查询匹配目录子文件,当目标文件类型为目录时
-o 只输出被PATTERN匹配到的内容,而非默认输出整行内容
-m # 匹配到内容的最大输出行数,如三行包含PATTERN,只输出两行,即可-m 2
-q 静默执行
-s 无提示,stderr会被忽略,-sq组合可完全屏蔽grep的输出
以上是对grep结果的规范选项—————————————————————
-H 输出文件名,在行内容前,当目标文件为多个时,默认
-n 显示行号
以上针对grep结果查看的选项—————————————————————
-A # 显示匹配行及其后#行内容,理论上共#+1行
-B # 显示匹配行及其前#行内容,理论上共#+1行
-C # 显示匹配行及其前后#行内容,理论上共2#+1行
关于grep命令的执行状态码:
0 成功匹配
1 未匹配
2 报错,一般是目标文件不存在
基本正则表达式:
其中,\( \) 不仅可以用作反向引用的匹配范围,也可以用于组合字符串。如下例:
[root@localhost tmp]# echo "xyz2xyzxy" |grep "xyz\?" -o
xyz
xyz
xy -----xy被匹配到
[root@localhost tmp]# echo "xyz2xyzxy" |grep "\(xyz\)\?" -o
xyz
xyz ------xy被为匹配到,由于xyz是一个组合,\?针对的是这个组合而言
扩展正则表达式:
基于基本正则表达式;
\? 变为 ?
\+ 变为 +
\{\}相关的PATTERN一律变为{} 的PATTERN,省去了\标志
\(\) 变为 ()
同时引入了 " | " 表示逻辑或,表示匹配多个内容:
chkconfig --list 3:on |grep -vE "crond|network|sshd|syslog"