grep小结

文本过滤工具:
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)     尚待解决,若有方法还望交流



欢迎网友评论留言,若有错误还望指出 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值