grep命令(文本查询)
1.概述:
- grep意为全面搜索正则表达式,是强大的文本搜索工具,并将其打印出来;
- grep命令的选项用于对搜索过程的补充,而其命令的模式十分灵活,可以是变量、字符串、正则表达式。注意:一当模式中包含了空格,务必要用双引号将其引起来;
- linux系统支持三种形式的grep命令:
① grep,标准grep命令,支持基本和扩展的正则表达式;
② egrep,扩展grep命令,其实和grep -E等价,支持基本和扩展的正则表达式;
③ fgrep,快速grep命令,其实和grep -F等价,不支持正则表达式,按照字符串表面意思进行匹配;
2.用法:
格式: grep [参数]
常用参数:
- -c:只输出匹配行的数量
- -l:只列出符合匹配的文件名,不列出具体的匹配行
- -n:列出所有的匹配行,显示行号
- -h:查询多文件时不显示文件名
- --color=auto:对匹配到的文本着色显示
- -v:显示不包含匹配文本的所有行
- -v "^#" filename:去掉注释行
- -v "^$" filename:去掉空行
[root@localhost ~]# grep -v "^#" filename | grep -v "^$" #完整输出去掉空行及注释命令
- -i:忽略大小写
- -r:递归搜索
- -o:仅显示匹配到的字符串,以字节为单位
- -q:静默模式,不输出任何信息
- -A N --after:后N行
- -B N --before:前N行
- -C N --context:前后各N行
- -E:使用ERE(使用扩展正则表达式) 等同于egrep
[root@localhost ~]# grep zwx file_* /etc/hosts #支持多文件查询并支持使用通配符
file_1:zwx
file_1:zwx
file_1:zwxddkjflkdjfdlkfjlsdkj
file_2:zwx
[root@localhost ~]# grep -c zwx file_* #输出匹配字符串行的数量
file_1:2
file_2:1
file_3:0
[root@localhost ~]# grep "^[Ss]" /proc/meminfo #显示/proc/meminfo文件中以大小写s开头的行
[root@localhost ~]# grep -i "^s" /proc/meminfo #忽略s的大小写
[root@localhost ~]# grep -v "/bin/bash$" /etc/passwd #显示/etc/passwd文件中不以/bin/bash结尾的行
[root@localhost ~]# id root > /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7 #如果root用户存在,显示其默认的shell程序;位置锚定
[root@localhost ~]# grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd #找出/etc/passwd中的两位或三位数; 贪婪匹配:继续往后匹配
[root@localhost ~]# grep "\<[0-9]\{2,3\}\>" /etc/passwd
[root@localhost ~]# grep -E "\<[0-9]{2,3}\>" /etc/passwd #使用egrep,扩展正则表达式
[root@localhost ~]# grep "^[[:space:]]\+[^[:space:]]\+" /etc/grub2.cfg #显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符行
[root@localhost ~]# netstat -tan | grep "LISTEN[[:space:]]*$" #找出“netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行
[root@localhost ~]# useradd bash && useradd testbash && useradd nologin -s /sbin/nologin #添加用户bash、testbash以及nologin(其shell为/sbin/nologin),然后找出/etc/passwd文件中用户名同shell名的行
bash:x:1010:1013::/home/bash:/bin/bash
nologin:x:1012:1015::/home/nologin:/sbin/nologin
[root@localhost ~]# grep -E "^(\<[[:alnum:]]+\>).*\1$" /etc/passwd #扩展正则表达式
[root@localhost ~]# grep "^\(\<[[:alnum:]]\+\>\).*\1$" /etc/passwd #基本正则表达式;\1:引用分组的内容;保证用户名和shell同名