grep与正则表达式使用

 

grep简介

grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。通常grep有三种版本grep、egrep(等同于grep -E)和fgrep。egrep为扩展的grep,fgrep则为快速grep(固定的字符串来对文本进行搜索,不支持正则表达式的引用但是查询极为快速)。grep是Linux文本处理三剑客之一。

grep使用方式

 常用选项:  –color=auto:对匹配到的文本着色后进行高亮显示;
-c:只输出匹配的行数 
-i:匹配时忽略大小写
-h:多文件匹配时不显示文件名,默认显示、
-l:只列出符合匹配的文件名,而不显示匹配的行内容
-n:显示行号、
-s:不显示错误消息
-q:禁止输出任何结果,以退出状态表示搜索是否成功 $? 查看,值0或者1
-v:取反,显示不包含匹配文件本的所有行
-o:只显示被匹配到的字符串
-C n:显示匹配字符前后面的行数
-A n:显示匹配字符后面的行数
-B n:显示匹配字符前面的行数 n:数值
-e : 实现多个参数之间的 ‘或’ 的关系 eg: grep -e root -e bash /ect/passwd
-w : 匹配单词

注:使用grep匹配时需使用双引号引起来(单引号为强引用),防止被系统误认为参数或者特殊命令而报错。

扩展grep使用方式

使用方式:egrep [OPTIONS] PATTERN [FILE…]

或 grep -E [OPTIONS] PATTERN [FILE…]

扩展正则表达式在基本正则表达式上进行了修改,主要取消反斜线转移,更容易看

字符匹配:

.: 任意单个字符
[]: 指定范围内的任意单个字符
[^]: 指定范围外的任意单个字符

次数匹配:

*:匹配其前面的字符任意次;
?: 匹配其前面的字符0或1次;
+: 匹配其前面的字符至少1次
{m}: 匹配其前面的字符m次;
{m,n}: 至少m次,至多n次
{m,}: 至少m次;
{0,n}:至多n次;

锚定:

^: 行首
$: 行尾
\<, \b: 词首
\>, \b:词尾

分组:

(): 分组
|: 或者, ac|bc
grep -E "con(C|c)at" 匹配conCat或concat
                

grep基本正则表达式元字符

匹配次数

  *:前一个字符出现任意次数,包括0次
.* :任意字符出现任意次数
\?:前一个字符出现1次或者0次
\+:出现1次或者1次以上
\{n\}:精确匹配次数
\{m,n\}:匹配m到n次之间
\{n,\} :匹配最少n次以上
\{,n\} :匹配最多n次以上
[a-z]\+ : 任意一个字符至少出现一次 ;
. 在[]中没有任何意义,就是点本身

位置锚定

^ : 匹配行首
$ ; 匹配行尾
^$: 匹配空白行
[^]:取反匹配

分组

    \(匹配内容\) :匹配括号内的内容
\n (数字) :重复前面匹配的内容再匹配
eg:匹配开头行和结尾行一样的行
[root@yufu ~]# grep "^\(.*\):.*/\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

后向引用:引用前面的分组括号中的模式所匹配到的字符 分组括号中的模式匹配到的内容或被正则表达式引擎自动记录于内部的变量中: \1:模式从左侧起,第一个左括号及与之匹配的右括号之间模式匹配到的内容 \2:模式从左侧起,第二个左括号及与之匹配的右括号之间模式匹配到的内容…

扩展正则表达式与正则表达式略有不同:
‘[]’:依旧匹配指定范围内的任意单个字符;但是有很多特殊匹配方式。
[:digit:] 匹配任意单个数字
[:lower:] 匹配任意单个小写字母
[:upper:] 匹配任意单个大写字母
[:alpha:] 匹配任意单个字母
[:alnum:] 匹配任意单个字母或数字
[:punct:] 匹配任意单个符号
[:space:] 匹配单个空格
一些地方取消了转义字符的使用:
‘?‘:匹配其前面的字符0次或者1次;
‘+’:匹配其前面的字符1次或者多次;
‘{m}‘:匹配其前面的字符m次(\为转义字符)
‘{m,n}’:匹配其前面的字符至少m次,至多n次
():将一个或多个字符捆绑在一起,当做一个整体进行处理,反向引用照常使用。
|’:或(注:‘C|cat’为C与cat,‘(C|c)at才是Cat与cat’)

一些例子

1.显示/proc/meminfo文件中以大小写s开头的行
[root@localhost ~]#cat /proc/meminfo | grep -io "^[s].*"
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Shmem: 6900 kB
Slab: 36828 kB
SReclaimable: 18184 kB
SUnreclaim: 18644 kB
2.取出默认shell为非bash的用户
[root@localhost ~]#cat /etc/passwd | grep -v "[bash]$" | cut -d : -f 1
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
...省略...
3.取出默认shell为bash的且其ID号最大的用户
[root@localhost ~]#cat /etc/passwd | grep "bash$" | cut -d: -f 3 | sort -nr | head -1
1003
4.显示/boot/grub/grub.conf中以至少一个空白字符开头的行
[root@yufu ~]# cat /boot/grub/grub.conf | grep "^[[:space:]]\+"
root (hd0,0)
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=96cb6b8f-c3da-41d1-a063-cfd0e8177085 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-696.el6.x86_64.img
5.找出/etc/passwd文件中一位数或两位数
[root@yufu ~]# cat /etc/passwd | grep -o "\<[0-9][0-9]\>"
12
10
14
11
12
13
30
14
50
99
99
81
81
69
...省略...
6.找出ifconfig命令结果中所有ip地址
[root@yufu ~]# ifconfig | grep -o "[0-9.]\{7,\}"
192.168.214.187
192.168.214.255
255.255.255.0
127.0.0.1
255.0.0.0
7.添加用户bash和testbash、basher,而后找出当前系统上其用户名和默认shell相同的用户
[root@yufu ~]# cat /etc/passwd | grep -E "^\<([[:alpha:]]{1,})\>:.*\1$"
或者:[root@yufu ~]# cat /etc/passwd | grep -E "^\<([a-zA-Z]{1,})\>:.*\1$"
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
8.统计/etc/rc.d/rc.sysinit文件中以#开头的行的行数,以及空白行的行数
#开头的行
[root@yufu ~]# grep "^#.*" /etc/rc.d/rc.sysinit | wc -l
44
#空行
[root@yufu ~]# grep "^$" /etc/rc.d/rc.sysinit | wc -l
100
9.利用df和grep,取出磁盘各分区利用率,并从大到小排序
[root@yufu ~]# df -h | grep "^/dev" | grep -o "[0-9]\+%" | grep -o "[0-9]\+" | sort -nr 
29
21
1

posted on 2018-04-29 16:01  孤岛鱼夫  阅读(8598)  评论(0编辑  收藏  举报