Linux“文本三剑客”之grep

grep,Global search REgular expression and Print out the line. 是Linux中常用的文本搜索工具,基于正则表达式(Regular Expression)和文本字符来编写模式(Pattern),然后根据指定的模式对目标文本逐行进行匹配,打印匹配到的行。

  1. grep工具分类
  2. grep命令
  3. 正则表达式
    (1) 基本正则表达式的元字符
    (2) 扩展正则表达式的元字符
  4. grep工具的应用实例

1. grep工具分类

grep工具共有三个:

  • grep - 默认支持基本正则表达式BRE;
  • egrep - 默认支持扩展正则表达式ERE;
  • fgrep - 默认不支持正则表达式。

虽然工具由三种,但三者都可以通过选项来达到彼此的使用效果:

  • grep
    (1) grep -E:相当于egrep
    (2) grep -F:相当于fgrep
  • egrep
    (1) egrep -G:相当于grep
    (2) egrep -F:相当于fgrep
  • fgrep
    (1) fgrep -G:相当于grep
    (2) fgrep -E:相当于egrep

所以一般只使用grep配合选项来达到不同的效果即可。
另外,如果需要进行文本搜索的是很大的文件,尽量使用fgrep或-F选项来直接匹配文本,不通过正则表达式处理,性能会有较大提高,f就是fast之意。

2. grep命令

  • grep [OPTIONS] PATTERN [FILE...]
    grep [OPRIONS] [-e PATTERN | -f FILE] [FILE...]

  • OPTIONS
    --color=auto:高亮显示匹配到的文本
    -i:--ignore-case:忽略字符大小写
    -o:仅显示匹配到的字符串本身,而非整行(默认显示被模式匹配到的行)
    -v:--invert-match:反向匹配,仅显示不能被模式匹配到的行
    -E:支持使用扩展的正则表达式
    -q:--quiet,--silent:静默模式,即不输出任何信息

grep还可以显示匹配到的行的上下文:
-A #:after:后#行
-B #:before:前#行
-C #:context:前后各#行

要用好grep等具有正则表达式引擎的工具,熟练应用正则表达式才是根本。

3. 正则表达式

正则表达式:Regular Expression,REGEXP。

正则表达式是由一类特殊字符及本本字符本身所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能。

正则表达式分为两类:

基本正则表达式:BRE
扩展正则表达式:ERE

(1) 基本正则表达式的元字符

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

字符集:
[:digit:],[:lower:],[:upper:],[:alpha:],[:alnum:],[:punct:],[:space:],等等

  • 次数匹配
    用在要指定其出现次数的字符的后面,用于限制其前面字符出现的次数。。
    *:匹配其前面的字符任意次
    比如:.*:匹配任意长度的任意字符
    ?:匹配其前面的字符0次或1次,即其前面的字符是可有可无的
    +:匹配其前面的字符1次或多次,即其前面的要出现至少1次
    {m}:匹配其前面的字符m次
    {m,n}:匹配其前面的字符至少m到n次

  • 位置锚定
    ^:行首锚定:用于模式的最左侧
    $:行尾锚定:用于模式的最右侧
    如: ^PATTERN$:用PATTERN来匹配整行
    ^$:匹配空白行,这行不包含任意字符(连空格也没有)
    ^[[:space:]]*$:空行或包含space的行
    < 或 \b:词首锚定:用于单词模式的左侧
    > 或 \b:词尾锚定:用于单词模式的右侧
    如:\<PATTERN\>用于匹配完整单词

这里强调一下LInux中单词的含义:非特殊字符组成的连续字符(字符串)都称为单词。
即:如果有特殊字符或空格出现,则单词中断。

  • 分组及引用
    \(\):将一个或多个字符捆绑在一起,当做一个整体进行处理
    如\(xy\)*z:表示匹配“xy”任意次

    \#:后向引用,#表示序号,引用前面的分组括号中的模式所匹配到的字符

分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配的字符
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配的字符
\3
...

(2) 扩展正则表达式的元字符

  • 字符匹配

扩展正则表达式的字符匹配元字符和基本正则表达式相同。

  • 次数匹配
    扩展正则表达式的次数匹配元字符省去了反斜线\,更易读:
    *:任意次(即0,1,或多次)
    ?:0次或1次,其前的字符是可有可无的
    +:其前字符至少1次
    {m}:其前的字符m次
    {m,n}:至少m次,至多n次

  • 位置锚定

扩展正则表达式的位置锚定元字符和基本正则表达式相同。

  • 分组及引用
    扩展正则表达式的分组元字符省去了反斜线\,更易读:
    ():分组

后向引用元字符和基本正则表达式相同

  • “或”关系
    扩展正则表达式比基本正则表达式多了一个“或”的元字符:
    |:“或”
    如:a|b:a或者b
    C|cat:C或cat
    (c|C)at:cat或Cat

4. grep工具的应用实例

  1. 显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式
    第一种方式,直接使用grep工具:
    [root@localhost ~]# grep '^[s,S]' /proc/meminfo
    SwapCached: 0 kB
    SwapTotal: 975868 kB
    SwapFree: 975868 kB
    Shmem: 4684 kB
    Slab: 55728 kB
    SReclaimable: 20580 kB
    SUnreclaim: 35148 kB
    第二种方式,先用cat,然后通过管道将命令结果交给grep处理:
    [root@localhost ~]# cat /proc/meminfo | grep '^[s,S]'
    SwapCached: 0 kB
    SwapTotal: 975868 kB
    SwapFree: 975868 kB
    Shmem: 4684 kB
    Slab: 55880 kB
    SReclaimable: 20588 kB
    SUnreclaim: 35292 kB

  2. 显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户
    [root@localhost ~]# grep -v '/sbin/nologin$' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    amandabackup:x:33:6:Amanda user:/var/lib/amanda:/bin/bash
    tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat:/bin/nologin
    hadoop:x:1500:1500::/home/hadoop:/bin/bash

8、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
[root@localhost ~]# grep '/bin/bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
amandabackup:x:33:6:Amanda user:/var/lib/amanda:/bin/bash
hadoop:x:1500:1500::/home/hadoop:/bin/bash

9、找出/etc/passwd文件中的一位数或两位数;
[root@localhost ~]# grep -o "\<[[:digit:]]\{1,2\}\>" /etc/passwd
0
0
1
1
2
2
...

10、显示/boot/grub2/grub.conf中以至少一个空白字符开头的行
[root@localhost ~]# grep '^[[:space:]]\+' /boot/grub2/grub.cfg

11、显示/etc/rc.d/rc.local文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行
[root@localhost ~]# grep '^#[[:space:]]\+[^[:space:]]' /etc/rc.d/rc.local
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.

12、打出netstat -tan命令执行结果中以‘LISTEN’,后跟空白字符结尾的行
[root@localhost ~]# netstat -tan | grep 'LISTEN[[:space:]]\+$'
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
13、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;
[root@localhost ~]# grep -E "(\<[[:alnum:]]+\>).*\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
bash:x:1501:1501::/home/bash:/bin/bash
nologin:x:1504:1504::/home/nologin:/sbin/nologin

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270