文本过滤工具:
grep: Galobal research Regular Expression and Printing
egrep
fgrep fast
regexp: 元字符
两类:
basic regexp:基本正则表达式
extended regexp:扩展正则表达式
grep [options] PATTERN file1 ...
basic regexp:基本正则表达式
元字符:
. : 匹配任意单个字符
[]: 指定范围内的任意单个字符
[abc], [aA]
[Cc]at
[^] 取反
[:upper:], [:lower:], [:digit:]数字, [:alpha:]字母, [:alnum:], [:space:], [:punct:]符号
[[:upper:]]
* : 匹配其前面的字符任意次 任意长度
ab*c:abc,abbc,ac a不匹配
.* :任意长度的任意字符,贪婪模式
X\{m,n\} :匹配m-n次X
X\{m,\} 至少m次X
X\{0,n\} 匹配0-n次 X
X\{m\} 精确匹配m次X
? :匹配其前面的字符0次或1次
ab?c: abc,ac
锚定符:
^:锚定行首
^r..t r..t出现在行首
$: 锚定行尾
^$:空白行
\<或\b 锚定词首
\<r..t, \br..t
\>或\b 锚定词尾 \br..t\b或\<r..t\> 词r..t
r..t\>, r..t\b
\(\): 分组
\ 转义
后向引用:\1 引用第1组()中的词,\2 引用第2组()中的词
grep "\(l..e\).*\1r" 第三行不匹配
He love his
lover
She likes her
liker
He love his
liker 前后不一样 love、like
grep选项:
-v: 对结果取反 invert-match-i: 忽略字母大小写
-o: 仅显示匹配到的字符串 only-matching
-E: 支持扩展正则表达式
-A n:匹配行之后再显示n行,after
-B n:匹配行之前再显示n行,before
-C n:匹配行前后再显示n行,context
扩展的正则表达式
\(\) 变成 () \{\} 变成 {}
+:次数匹配,匹配其前的字符至少1次;
|:或者 (C|c)at:Cat,cat; C|cat:C,cat
grep --color -E "\<[1-9]|[1-9][0-9]\>" 表示以[1-9]或[1-9]开头,以[0-9]结尾的
grep --color -E "\<([1-9]|[1-9][0-9])\>" 表示[1-9]或[1-9][0-9]
grep --color -E "\<([1-9]|[1-9][0-9]|[1-9][0-9][0-9])\>"
表示1、2、3位数
grep --color -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])\>"
1-255
grep --color -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-5]{2})\>" 1-255 [0-5]{2}:匹配2次[0-5]
举例 (方法不止一种)
查找当前系统上名字为user后面跟数字的用户的相关信息
grep "^user[0-9]\{1,\}\>" /etc/passwd 至少有1个数字 ,出现在词尾
查找当前系统上以其为附加组的用户有两个或两个以上的组名 (找/etc/group最后字段中的逗号)
grep "," /etc/group | cut -d: -f1
查找当前系统上其用户帐号密码最长使用期为99999天的用户账号;
grep "99999" /etc/shadow | cut -d: -f1
分析/etc/inittab文件中如下两行的文本特征,精确找到类似两行的模式,而且要求每一行中出现在数字必须相同:
l1:1:wait:/etc/rc.d/rc 1
l3:3:wait:/etc/rc.d/rc 3
grep "l\([0-9]\):\1:.* \1" /etc/inittab
grep "l\([0-9]\{1,\}\):\1:.*
\1" /etc/inittab
显示/proc/meminfo文件中以不区分大小的s开头的行;
grep "^[Ss]" /proc/meminfo
显示/etc/passwd中以nologin结尾的行;
grep "nologin$" /etc/passwd
显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab
显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;
grep ":[0-9]:" /etc/inittab
显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;
grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行;
grep "^\([0-9]\).*\1$" /etc/inittab
取出当前系统上以eth开头的网络设备的IP地址:
ifconfig | grep -A 1 "^eth" | grep -o "addr:[0-9.]\{1,\}" | cut -d: -f2
取出当前系统上没有IP地址的网络设备的名称:
ifconfig | grep --color -A 1 "^[^[:space:]]" | grep -B 1 "addr:[[:space:]]" | cut -d' ' -f1
取出当前系统上网络设备的IP地址(127.0.0.1除外)
ifconfig | grep "inet addr" | grep -v "127.0.0.1" | cut -d: -f2 | cut -d' ' -f1
进阶难度 :精确匹配 A、B、C类IP地址 (1-127,128-191,192-223) 尚待解决,若有方法还望交流
欢迎网友评论留言,若有错误还望指出