grep:文本过滤工具

grep [OPTION]PATTERN [FILE...]
--color=auto 将匹配到的文本高亮显示
-i 忽略匹配到文本的大小写
-o 仅显示匹配到的字符串
-v 显示不能被模式匹配到的行
-q 静默模式,命令行中不打印匹配结果。
-A # 可以跟数字,意为将匹配到行得前n行打印
-B # 可以跟数字,意为将匹配到行得后n行打印
-C # 可以跟数字,意为将匹配到行得前后各n行打印

正则表达式 regexp
有一类特殊字符以及文本字符所编写的模式,其中有些字符不表示其字面表示意义,用于表示控制或者通配功能;
分两类:
基本正则表达式
扩展正则表达式

基本正则表达式元字符:
字符匹配:
.:匹配任单个字符
[]:匹配指定范围内,任意单个字符
[^]: 匹配指定范围外得任意单个字符
[[:digit:]]数字 [[:lower:]]小写 [[:alpha:]]所有字母 [[:upper:]]大写 [[:alnum:]]所有字母包含数字 [[:punct:]]所有标点 [[:space:]]空白字符
匹配次数:
*:匹配其前面字符,任意次,0次,一次,多次
例子: x*y
abxy x出现一次
aby x出现0次
abxxxxxxxxxxxxxy x出现多次
.*:匹配任意长度任意字符
grep r.* /etc/passwd
\?:匹配前面字符0次或者1次,前面字符可有可无。
\+:匹配前面字符一次或多次,即前面字符至少出现1次
\{m\}:匹配前面字符m次。
\{m,n\}:匹配前面字符,至少m次,至多n次
\{0,n\}: 至多n次。
\{m,\}: 至少m次。
位置锚定:
^:行首锚定:用于模式得最左侧。
$:行尾锚定:用于模式得最右侧。
^$:匹配空白行
^[[:space:]]*$:表示空行或者包含空白字符得行
\<或者\b,词首锚定,用于单词最左侧
grep "\<root" /etc/passwd
\>或者\b 只能出现在单词词尾,用于单词右侧
grep "root\>" /etc/passwd
\<PATTERN\>: 完整匹配一个单词
练习:
1.显示/etc/passwd文件中,不已/bin/bash结尾得行
grep -v "/bin/bash$" /etc/passwd
2.找出/etc/passwd文件中两位数或三位数(要锚定词首词尾)
grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd
3.找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面存在非空白字符的行
grep "^[[:space:]]\+[[:alnum:]]\+" /etc/grub2.cfg
grep "^[[:space:]]\+[^[:space:]]\+" /etc/grub2.cfg
4.找出"netstat -ant"命令中以LISTEN后跟0个1个或多个空白字符结尾的行
netstat -ant | grep "LISTEN[[:space:]]*$"
分组及引用
1.\(xy\)*ab,将一个或多个组合在一起,当作一个整体进行处理
2.分组括号中的模式匹配到的内容会被正则表达式引擎内部变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的优酷好之间的模式匹配到的字符
\2:模式从左侧起,第二个左括号以及与之匹配的优酷好之间的模式匹配到的字符
\3:模式从左侧起,第三个左括号以及与之匹配的优酷好之间的模式匹配到的字符
例子:
He loves his lover
He likes his lover
She lovers her liker
She likes her liker
找出以上句子中,有重复的单词
grep "\(l..e\).*\1" like.txt
egrep:
扩展正则表达式,实现类似于grep的文本过滤功能;
扩展正则表达式的元字符:
字符匹配:
.:任意单个字符
[]:指定范围内任意单个字符
[^]:指定范围外任意多个字符
次数匹配:
*:
?:0次或1次
+:一次或多次
{m}:匹配m次
{m,n}:至少m次,至多n次
{0,n}:
{m,}:
{,n}:
.*:
位置锚定:
^行首锚定:用于模式得最左侧。
$行尾锚定:用于模式得最右侧。
\< \b 词首锚定,用于单词最左侧
\> \b 词尾锚定
分组及引用:
() 分组括号中的模式匹配到的内容会被正则表达式引擎内部变量中,这些变量为:
\1:
\2:
\3:

a|b:a或者b
C|cat:表示C或者cat
(C|c)at:表示cat或Cat
练习:
1.寻找配置文件中ip
egrep "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" application.properties
2.找出/proc/meminfo文件中,所有以S或s开头的行,至少三种:
egrep "^(s|S)" /proc/meminfo
grep ^[Ss] /proc/meminfo
grep -i ^s /proc/meminfo
3.显示当前系统root、centos或user1用户的相关信息
cat /etc/passwd | egrep "centos|^root\>"
4.找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
grep "[[:alnum:]]\+()" /etc/rc.d/init.d/functions
egrep "[[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
5.使用echo输出一个绝对路径,使用grep命令取出基名
echo "etc/sysconfig"|egrep -o "[^/]+/?$"
取出路径名:

6.找出ifconfig命令,结果中1-255之间的值
ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
7.找出ifconfig命令,结果中的IP地址

8.添加nologin用户,指定shell为nologin,找出用户名和默认shell相同的用户
egrep "(^[^:]+\>).*\1$" /etc/passwd

fgrep:不支持正则表达式
当无需用到元字符编写模式时,使用fgrep性能更好。