linux命令之-grep,egrep
grep命令
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
一、语法格式:
grep 选项 参数 文件
Usage: grep [OPTION]... PATTERN [FILE]...
二、常用命令参数
[code]-a 不要忽略二进制数据。 -A <显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容 -b 在显示符合范本样式的那一行之外,并显示该行之前的内容 -c 计算符合范本样式的列数 -C <显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。 -d <进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作 -e <范本样式> 匹配多个样式 -E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式 -f <范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式 -F 将范本样式视为固定字符串的列表 -G 将范本样式视为普通的表示法来使用 -h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称 -H 在显示符合范本样式的那一列之前,标示该列的文件名称 -i 忽略字符大小写 -l 列出文件内容符合指定的范本样式的文件名称 -L 列出文件内容不符合指定的范本样式的文件名称 -n 在显示符合范本样式的那一列之前,标示出该列的编号 -q 不显示任何信息 -R/-r 递归查询 -s 不显示错误信息 -v 反转查找 -w 正则匹配只包含完全字符的内容,如roo只匹配roo,不匹配root,roott等 -x 只显示全列符合的列 -y 此参数效果跟“-i”相同 -o 只输出文件中匹配到的部分
三、grep正则表达式
[code]^ 如:^zhang,表示匹配所有以zhang开头的行。 $ 如:zhang$,表示匹配所有以zhang结尾的行。 . 匹配一个除换行符之外的字符,如:zha.g,匹配zha后接一个任意字符除换行符之外,然后是g。 * 匹配零个或多个先前字符,如:*zhang,匹配所有一个或多个字符后面紧跟grep的行。 .* 匹配任意一个字符出现零次或多次,结合在一起通常表示任意字符 [] 匹配一个指定范围内的字符,如:[zh]ang,匹配zang和hang。 [^] 匹配一个指定范围内的字符,如:[^A-DG-Z],匹配不包含A-D和G-Z字母开头的行 \(..\) 标记匹配字符,如'\(love\)',love被标记为1。 \< 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。 \> 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。 \<...\> 匹配只包含括号里面的单词的行,如匹配\<zhangjunchao\>,zhangjunchao110这种不匹配。 x\{m\} 重复字符x,m次,如:'o\{5\}'匹配包含5个o的行。 x\{m,\} 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。 x\{m,n\} 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。 \w 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。 \W \w的反置形式,匹配一个或多个非单词字符,如点号句号等。 \b 单词锁定符,如: '\bgrep\b'只匹配grep。
四、grep命令常见用法
注:此处所有的grep命令用法我将以 a.txt 文件里面的内容作为演示的参考
[code][root@iZwz9bhan5nqzh979qokrkZ ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
4.1 过滤关键字行
[code]root@iZwz9bhan5nqzh979qokrkZ ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
4.2 过滤关键字行显示关键字在文本的行数
[code][root@iZwz9bhan5nqzh979qokrkZ ~]# grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin
4.3 带颜色显示关键字在文本的行数字
[code][root@iZwz9bhan5nqzh979qokrkZ ~]# grep -n root --color /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin
4.4 不区分大小写
[code][root@iZwz9bhan5nqzh979qokrkZ ~]# grep -i root --color /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
4.5 取反
[code][root@iZwz9bhan5nqzh979qokrkZ ~]# grep -v root --color /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
4.6 显示带关键字的行数
[code][root@iZwz9bhan5nqzh979qokrkZ ~]# grep -c root /etc/passwd 2
4.7 显示关键字行和后面的2行(总共3行) After
[code][root@iZwz9bhan5nqzh979qokrkZ ~]# grep -A 2 root /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin -- operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
4.8 显示关键字行和前面的2行 Before
[code][root@iZwz9bhan5nqzh979qokrkZ ~]# grep -B 2 root /etc/passwd root:x:0:0:root:/root:/bin/bash -- halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
4.9 匹配IP地址 -E 扩展正则表达式
[code][root@iZwz9bhan5nqzh979qokrkZ ~]# ifconfig eth0 | grep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" inet 172.18.108.103 netmask 255.255.240.0 broadcast 172.18.111.255 [root@iZwz9bhan5nqzh979qokrkZ ~]# ifconfig eth0 | grep -E "([0-9]{1,3}\.){3}[0-9]" inet 172.18.108.103 netmask 255.255.240.0 broadcast 172.18.111.255
注:.有特殊意义,所以需要转义
4.10
[code]将a.txt文件中不包含400的行输入到b.txt文件中 [root@iZwz9bhan5nqzh979qokrkZ ~]# grep '.' a.txt | grep -Ev "400" > b.txt [root@iZwz9bhan5nqzh979qokrkZ ~]# grep '.' a.txt | grep -Ev "(400|502|110|390)" > b.txt
注:多个条件需要用到-E参数
4.11 递归查找
[code][root@iZwz9bhan5nqzh979qokrkZ ~]# grep -R -n --color "Hostname" /usr/local/zabbix 136:### Option: Hostname 139:# Value is acquired from HostnameItem if undefined. 143:# Hostname= 145:Hostname=host-39-108-217-12 [root@iZwz9bhan5nqzh979qokrkZ ~]# grep -E -R -n --color "(Hostname|Server)" /usr/local/zabbix 82:### Option: Server 87:# Example: Server=127.0.0.1,192.168.1.0/24,::1,2001:db8::/32,zabbix.domain 91:# Server= 93:Server=39.108.217.12 122:### Option: ServerActive 128:# Example: ServerActive=127.0.0.1:20051,zabbix.domain,[::1]:30051,::1,[12fc::1] 132:# ServerActive= 134:# ServerActive=127.0.0.1 136:### Option: Hostname 139:# Value is acquired from HostnameItem if undefined. 143:# Hostname=
注:-n:打印行号 --color:带颜色 -R:递归查询 -E:支持扩展正则
4.12
选项 -e:匹配多个匹配样式 -o:只输出匹配到的内容
[code][root@iZwz9bhan5nqzh979qokrkZ ~]# echo this is a text line | grep -e "is" -e "line" -o is is line
4.13 搜索多个文件并查找匹配文本在哪些文件中:
[code][root@iZwz9bhan5nqzh979qokrkZ ~]# grep 'zhangjunchao' /root -lr /root/b.txt /root/a.txt
4.14 在grep搜索结果中包括或者排除指定文件:
[code]只在目录中所有的.php和.html文件中递归搜索字符"main()" [root@iZwz9bhan5nqzh979qokrkZ ~]# grep "main()" . -r --include *.{php,html} 在搜索结果中排除所有README文件 [root@iZwz9bhan5nqzh979qokrkZ ~]# grep "main()" . -r --exclude "README" 在搜索结果中排除filelist文件列表里的文件 [root@iZwz9bhan5nqzh979qokrkZ ~]# grep "main()" . -r --exclude-from filelis 3ff7 t
五、补充:grep使用多个查询条件?
[code]1. \ | 符号法 [root@mail ~]# grep 'usrquota\ |grpquota' /etc/fstab 2. 使用多个-e参数 netstat -an | grep -e EST -e WAIT 并列使用多个-e参数可以实现或条件 3. 使用扩展-E netstat -an | grep -E "ESTABLISHED|WAIT" 此处的 -E 是大写 ,匹配条件一定要加 引号
1、打印包含字母的行
[code]--打印第1个字母大写,第2、3个字母小写,第4个为空格,第5个大写的行 [root@db1 shell_stu]# grep '[A-Z][a-z][a-z] [A-Z]' emp.txt --打印第1个字母大写,第2、3个字母小写,第4个大写的行 [root@db1 shell_stu]# grep '[A-Z][a-z][a-z][A-Z]' emp.txt 0001 AleN M 24 0004 JacK F 24
2、打印至少有4个字母连在一起的行
[code][root@db1 shell_stu]# grep '[a-z]\{4\}' emp.txt 0002 Tiboo M 32 0003 Felix M 26 00010 Peter M 28 00011 Allen M 26
9、\< 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
\> 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
\<...\> 匹配只包含括号里面的单词的行,如匹配\<zhangjunchao\>,zhangjunchao110这种不匹配。
[code]打印所有以Audi开始的词的行,\<是词首定位符 [root@db1 shell_stu]# grep '\<Audi' emp.txt 0006 Audi F 30
[code]打印所有以o结尾的词的行,\>是词尾定位符 [root@db1 shell_stu]# grep 'o\>' emp.txt 0002 Tiboo M 32 0007 Bobo F 32 0008 Geo M 21
[code]打印所有包含Audi词的行 [root@db1 shell_stu]# grep '\<Audi\>' emp.txt 0006 Audi F 30
[code]打印所有以A至Z开始,以o结尾的词的行 [root@db1 shell_stu]# grep '\<[A-Z].*o\>' emp.txt 0002 Tiboo M 32 0007 Bobo F 32 0008 Geo M 21
grep高级使用理解
1、待查找的文件有几千万行,你的规则有几百条
[code]grep -f patter.txt file f :后跟规则文件,把每条正则表达式写入patrern.txt中
2、你需要使用linux扩展正在表达式
grep -E pattern file
默认情况下grep只支持基础正在表达式,E选项可以支持扩展表达式(也可以待地gerp -E 为egrep)
什么是扩展正在表达式?
[code]linux扩展正在表达式 是在原有标准正则表达式 + 重复一个或者一个以上的前一个字符,如a+表示一个以上的a ? 0个或者1个前一个字符,如a?表示空白或者1个a | 或,如要查找aa或者bb这两个字符串,egrep -n 'aa|bb file () 查找组字符串,如查找head或者had, egrep -n 'h(ea|a)d' file ()+ 多个重复组的判别,如查找A开头C结尾,中间有一个以上的xyz或aaa,egrep -n 'A(xyz|aaa)+C' file
3、你想看到被匹配的行周围(前后)的行
grep -A2 -B2 'aaa' file
-A :after,显示匹配行后的行 -A2 显示 后2行
-B :before,显示匹配行前的行 -B2 显示 前2行
如果你真的同时需要显示,前后各n行,那么你可以用-C选项
grep -C2 'aaa' file 作用与-A2 -B2完全相同
egrep命令
egrep用于在文件中查找指定的字符串,与grep -E相似,使用语法可参考grep命令。
语法:egrep(选项)(查找模式)(文件名1,文件名2,……)
实例一:筛选字符串
[root@iZwz9bhan5nqzh979qokrkZ ~]# cat a.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@iZwz9bhan5nqzh979qokrkZ ~]# egrep '(o)+' a.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@iZwz9bhan5nqzh979qokrkZ ~]# egrep '(oo)+' a.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
注:用( )表示一个整体,例如(oo)+就表示1个 ‘oo’ 或者多个 ‘oo’
实例二:筛选字符串
[root@iZwz9bhan5nqzh979qokrkZ ~]# egrep "bin|daemon|adm" a.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@iZwz9bhan5nqzh979qokrkZ ~]# grep -E "bin|daemon|adm" a.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
注:在一定场景下egrep等同于grep -E
- linux学习之grep egrep 命令及正则表达式
- Linux正则表达式的使用和基本命令grep、egrep、fgrep的用法
- linux文件内容查找高级命令 grep egrep fgrep
- Linux下grep、egrep及fgrep命令详解
- Linux中 文本处理命令 grep egrep fgrep的使
- linux基本命令grep egrep fgrep用法以及正则表达式
- linux之grep和egrep命令
- Linux grep和egrep命令
- Linux中 grep/egrep的命令收集
- Linux grep、egrep 命令使用示例及详解
- linux基本命令grep egrep fgrep用法以及正则表达式
- linux基本命令grep egrep fgrep
- Linux egrep grep命令的使用
- Linux学习命令汇总三——Linux用户组管理,文件权限管理,文本处理工具grep及egrep
- Linux 命令grep, egrep,正则表达式大全
- linux常用命令-文本查找,grep,egrep,regexp
- linux基本命令grep egrep fgrep用法以及正则表达式
- Linux之grep和egrep命令总结
- linux利用grep查看打印匹配的下几行或前后几行的命令
- linux中的grep命令用法