grep:文本过滤(模式:pattern)工具
grep家族介绍:
grep:标准grep命令,支持标准的正则表达式 BRE
egrep:扩展的grep命令,支持扩展的正则表达式 ERE
fgrep:快速的grep命令,不支持正则表达式
grep作用:
文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行; 模式:由正则表达式字符及文本字符所编写的过滤条件; REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能;
grep一般格式为:
grep [选项] 正则表达式 [文件]
grep选项:
--color=auto: 对匹配到的文本着色显示;centos 7默认带 -v: 显示不能够被pattern匹配到的行; -i: 忽略字符大小写; -o: 仅显示匹配到的字符串; -q: 静默模式,不输出任何信息; -A #:after, 后#行 -B #: before, 前#行 -C #:context, 前后各#行 -E:等同于egrep,使用扩展的正则表达式
-v:
grep -v "bin/bash$" /etc/passwd
-o:
grep -o "\bt.*p\b" /etc/passwd
基本正则表达式元字符:
字符匹配:
.:匹配任意单个字符; []:匹配指定范围内的任意单个字符 [^]:匹配指定范围外的任意单个字符 还支持一些特殊的专用字符 [: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: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符; \(ab\+\(xy\)*\): \1: ab\+\(xy\)* \2: xy 后向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身)
练习:
1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)
grep -i "^s" /proc/meminfo grep "^[sS]" /proc/meminfo
2、显示/etc/passwd文件中不以/bin/bash结尾的行;
grep -v "/bin/bash$" /etc/passwd
3、显示/etc/passwd文件中ID号最大的用户的用户名;
sort -t: -k3 -n /etc/passwd|cut -d: -f1|tail -n 1
4、如果用户root存在,显示其默认的shell程序;
id root &>/dev/null && grep "^root\b" /etc/passwd |cut -d: -f7
5、找出/etc/passwd中的两位或三位数;
grep "\b[0-9]\{2,3\}\b" /etc/passwd
6、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存非空白字符的行;
grep --color=auto "[[:space:]]\+[^[:space:]]" /etc/rc.d/rc.sysinit
7、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行;
netstat -tan | grep "\bLISTEN[[:space:]]*$"
8、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;
grep "^\([[:alnum:]]\+\b\).*\1$" /etc/passwd
9、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
grep -v "/sbin/nologin$" /etc/passwd
10、找出/etc/passwd文件中的一位数或两位数;
grep "\b[0-9]\{1,2\}\b" /etc/passwd
11、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
grep '^[[:space:]]\+' /boot/grub/grub.conf
11、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
grep "^#\+[[:space:]]\+[^[:space:]]" /etc/rc.d/rc.sysinit
12、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;
netstat -tan |grep "\bLISTEN[[:space:]]\+$"
14、显示/proc/meminfo文件中以大写或小写S开头的行;用三种方式;
grep -i "^s" /proc/meminfo grep "^[sS]" /proc/meminfo egrep "^(s|S)" /proc/meminfo
16、显示/etc/passwd文件中其默认shell为/bin/bash的用户
grep "/bin/bash$" /etc/passwd | cut -d: -f 1
17、找出/etc/passwd文件中的一位数或两位数;
grep "\b[0-9]\{1,2\}\b" /etc/passwd
扩展正则表达式
字符匹配:
.:匹配任意单个字符; []:匹配指定范围内的任意字符; [^]:匹配指定范围外的任意字符
次数匹配:
*:匹配前面的字符任意次 ?: 匹配前面字符0或1次; +:匹配前面的字符最少1次; {m}:匹配前面的字符m次; {m,n}:匹配前面字符至少m,至多n次;
锚定:
^:一行的开头 $:行的结尾 \<, \b:单词的开始 \>, \b:单词的结束
分组:
():将一个或多个字符捆绑起来,组成一个整体处理 后向引用:\1, \2, ...
或者:
a|b C|cat: C或cat
练习题
1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
grep -E "[[:space:]]+" /etc/rc.d/rc.sysinit
2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
grep -E "#+[[:space:]]+[^[:space:]]" /etc/rc.d/rc.sysinit
3、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;
netstat -tan |grep -E "\bLISTEN[[:space:]]+$"
4、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;
grep -E "^([[:alnum:]]+\b).*\1$" /etc/passwd
5、显示当前系统上root、fedora或user1用户的默认shell;
grep -E "^(root|fedora|user1)" /etc/passwd | cut -d: -f1,7
6、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello();
egrep "[[:alnum:]]+\(\)" /etc/rc.d/init.d/functions 在扩展的正则表达式上(),是分组,需要用\进行逃逸。
7、使用echo命令输出一个绝对路径,使用grep取出其基名;
echo "/etc/passwd/" | egrep -o "[[:alpha:]]+" | tail -n 1
扩展:取出其路径名
echo "/etc/passwd" | sed 's@[^/]\+/\?$@@'
8、找出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"
9、挑战题:写一个模式,能匹配合理的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])\>"
10、挑战题:写一个模式,能匹配出所有的邮件地址;
egrep "[[:alnum:]]+_?[[:alnum:]]+@[[:alnum:]]+\.[[:alpha:]]+\.?[[:alpha:]]+?" abc
原创文章,作者:N21_ Dominic,如若转载,请注明出处:http://www.178linux.com/21933
评论列表(1条)
写的很好,排版也很棒,图画的也很棒,加油