grep:
Linux上文本处理三剑客 grep:文本过滤(模式:pattern)工具; grep: Global search REgular expression and Print out the line. 作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行; 模式:由正则表达式字符及文本字符所编写的过滤条件; REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能; 分两类: 基本正则表达式:BRE 扩展正则表达式:ERE grep -E, egrep
grep家族主要有grep(基本正则)、egrep(扩展正则)、fgrep(不支持正则)
grep [OPTIONS] PATTERN [FILE…]
选项: --color=auto: 对匹配到的文本着色显示;centos 7默认带-v: 显示不能够被pattern匹配到的行;-i: 忽略字符大小写;-o: 仅显示匹配到的字符串;-q: 静默模式,不输出任何信息;-A #:after, 后#行-B #: before, 前#行-C #:context, 前后各#行-R/-r: 此参数的效果和指定“-d recurse”参数相同-n :在显示符合范本样式的那一列之前,标示出该列的编号-E:使用ERE;
选项例子: 在多个文件中查找:
grep "match_pattern" file_1 file_2 file_3 ... 标记匹配颜色 --color=auto 选项 grep "match_pattern" file_name --color=auto忽略字符大小写 grep -i "^s" /proc/meminfo 仅显示匹配到的字符串 grep -o "^[sS]" /proc/meminfo 静默模式 grep -q "test" filename#不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。显示匹配某个结果之后的3行,使用 -A 选项: seq 10 | grep "5" -A 35678 显示匹配某个结果之前的3行,使用 -B 选项 seq 10 | grep "5" -B 32345显示匹配某个结果的前三行和后三行,使用 -C 选项 seq 10 | grep "5" -C 32345678使用扩展正则 grep -E "[1-9]+" 或 egrep "[1-9]+"在多级目录中对文本进行递归搜索 grep "text" . -r -n # .表示当前目录。 在grep搜索结果中包括或者排除指定文件#只在目录中所有的.php和.html文件中递归搜索字符"main()"grep "main()" . -r --include *.{php,html}#在搜索结果中排除所有README文件 grep "main()" . -r --exclude "README"#在搜索结果中排除filelist文件列表里的文件 grep "main()" . -r --exclude-from filelist
基本正则表达式
字符匹配: .:匹配任意单个字符[]:匹配指定范围内的任意单个字符[^]:匹配指定范围外的任意单个字符[-]:匹配[]中指定范围内的任意一个字符,要写成递增 POSIX字符类:[:digit:]:匹配任意一个数字字符[:lower:]:匹配小写字母[:upper:]:匹配大写字母[:alpha:]:匹配任意一个字母字符(包括大小写字母)[:alnum:]:匹配任意一个字母或数字字符[:space:]:匹配一个包括换行符、回车等在内的所有空白符[:punct:]:匹配标点符号\:转义符,将特殊字符进行转义,忽略其特殊意义 匹配次数: *:匹配前面的字符任意次 .*:任意长度的任意字符\?:匹配其前面的字符0或1次;即前面的可有可无\+:匹配其前面的字符至少1次;\{m\}:匹配前面的字符m次;\{m,n\}:匹配前面的字符至少m次,至多n次;\{0,n\}:匹配前面的字符至多n次;\{m,\}:匹配前面的字符至少m次; 位置锚定: ^:行首锚定;用于模式的最左侧;$:行尾锚定;用于模式的最右侧; ^PATTERN$: 用于模式匹配整行; ^$: 空行; ^[[:space:]]*$:空白行 单词锚定:\< 或 \b:词首锚定;用于单词模式的左侧;\> 或 \b:词尾锚定;用于单词模式的右侧;\<PATTERN\>:匹配整个单词; 分组: 分组:\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;\(xy\)*ab Note: 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ... \1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符; \2:从左侧起,第:二个左括号以及与之匹配右括号之间的模式所匹配到的字符;\(ab\+\(xy\)*\): \1: ab\+\(xy\)* \2: xy 后向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身)
例题:
1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式) grep "^[sS]" /proc/meminfo grep -i "^s" /proc/meminfo2、显示/etc/passwd文件中不以/bin/bash结尾的行; grep -v "/bin/bash$" /etc/passwd3、显示/etc/passwd文件中ID号最大的用户的用户名; sort -t: -k 3 /etc/passwd | cut -d: -f 1 | tail -n 1 4、如果用户root存在,显示其默认的shell程序; id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f75、找出/etc/passwd中的两位或三位数; grep "\<[0-9]\{2,3\}\>" /etc/passwd6、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存非空白字符的行; grep "^[[:space:]]\+[^[:space:]]" /etc/rc.d/rc.sysinit7、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行; netstat -tan | grep "LISTEN[[:space:]]*$"8、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行; grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd9、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户; grep -v "/sbin/nologin$" /etc/passwd10、显示/etc/passwd文件中其默认shell为/bin/bash的用户; grep "/bin/bash$" /etc/passwd11、找出/etc/passwd文件中的一位数或两位数 grep --color=auto "\b[0-9]\{1,2\}\b" /etc/passwd12、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; grep "^[:space:]\+[^[:space:]]" /boot/grub/grub.conf13、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;grep "^#.*[:space:]\+[^[:space:]]" /boot/grub/grub.conf14、使用echo命令输出一个绝对路径,使用grep取出其基名; echo "/etc/passwd/" | grep -o "[[:alpha:]]\+" | tail -n 1扩展:取出其路径名 echo "/etc/passwd" | sed 's@[^/]\+/\?$@@'
扩展正则表达式:
字符匹配 .:匹配任意单个字符 []:匹配指定范围内的任意单个字符 [^]:匹配指定范围外的任意单个字符 [-]:匹配[]中指定范围内的任意一个字符,要写成递增 POSIX字符类: [:digit:]:匹配任意一个数字字符 [:lower:]:匹配小写字母 [:upper:]:匹配大写字母 [:alpha:]:匹配任意一个字母字符(包括大小写字母) [:alnum:]:匹配任意一个字母或数字字符 [:space:]:匹配一个包括换行符、回车等在内的所有空白符 [:punct:]:匹配标点符号 \:转义符,将特殊字符进行转义,忽略其特殊意义 匹配次数:*:匹配前面的字符任意次.*:任意长度的任意字符 ?:匹配其前面的字符0或1次;即前面的可有可无 +:匹配其前面的字符至少1次; {m}:匹配前面的字符m次; {m,n}:匹配前面的字符至少m次,至多n次; {0,n}:匹配前面的字符至多n次; {m,}:匹配前面的字符至少m次; 位置锚定: ^:行首锚定;用于模式的最左侧; $:行尾锚定;用于模式的最右侧; ^PATTERN$: 用于模式匹配整行; ^$: 空行; ^[[:space:]]*$:空白行 单词锚定: \< 或 \b:词首锚定;用于单词模式的左侧; \> 或 \b:词尾锚定;用于单词模式的右侧; \<PATTERN\>:匹配整个单词; 分组: 分组: ():将一个或多个字符捆绑在一起,当作一个整体进行处理; (xy)*abNote: 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ... \1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符; \2:从左侧起,第:二个左括号以及与之匹配右括号之间的模式所匹配到的字符; 后向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身) 或者: a|b C|cat: C或cat
例题:
1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用三种方式) egrep "^[sS]" /proc/meminfo egrep -i "^s" /proc/meminfo egrep "^(s|S)" /proc/meminfo2、显示/etc/passwd文件中不以/bin/bash结尾的行; egrep -v "/bin/bash$" /etc/passwd3、显示/etc/passwd文件中ID号最大的用户的用户名; sort -t: -k 3 /etc/passwd | cut -d: -f 1 | tail -n 1 4、如果用户root存在,显示其默认的shell程序; id root &> /dev/null && egrep "^root\>" /etc/passwd | cut -d: -f75、找出/etc/passwd中的两位或三位数; egrep "\<[0-9]{2,3}\>" /etc/passwd6、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存非空白字符的行; egrep "^[[:space:]]+[^[:space:]]" /etc/rc.d/rc.sysinit7、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行; netstat -tan | egrep "LISTEN[[:space:]]*$"8、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行; egrep "^([[:alnum:]]+\>).*\1$" /etc/passwd9、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户; egrep -v "/bin/nologin" /etc/passwd 8、显示/etc/passwd文件中其默认shell为/bin/bash的用户;9、找出/etc/passwd文件中的一位数或两位数; egrep "\b[0-9]{1,2}\b" /etc/passwd10、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; egrep "[:space:]+[^[:space:]]" /boot/grub/grub.conf11、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;egrep "^#+[:space:]+[^[:space:]]" /boot/grub/grub.conf12、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行; egrep "^#.*[:space:]+[^[:space:]]" /boot/grub/grub.conf13、使用echo命令输出一个绝对路径,使用grep取出其基名; echo "/etc/passwd/" | egrep -o "[[:alpha:]]+" | tail -n 1扩展:取出其路径名 echo "/etc/passwd" | sed 's@[^/]\+/\?$@@'14、显示当前系统root、centos或user1用户的默认shell和UID; egrep '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,715、找出/etc/rc.d/init.d/functions文件(centos6)中某单词后面跟一个小括号的行; egrep -o "^[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions16、找出ifconfig命令结果中的1-255之间数字; ifconfig |egrep "\b[1-9][0-9]?\b|\b1[0-9]{2}\b|\b2[0-4][0-9]\b|\b25[0-5]\b"17、挑战题:写一个模式,能匹配合理的IP地址; ifconfig |egrep "(\<([0,1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0,1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\>"18、挑战题:写一个模式,能匹配出所有的邮件地址 egrep "[[:alnum:]]+_?[[:alnum:]]+@[[:alnum:]]+\.[[:alpha:]]+\.?[[:alpha:]]+?" abc
原创文章,作者:N21_ Dominic,如若转载,请注明出处:http://www.178linux.com/50231