• 三剑客之 grep



    本文参考文献:

    GNU Grep 3.8

    grep 是一个在 UNIX 上的命令行工具,它通过给定的模式(pattern)来搜索一个输入文件,并输出匹配到这些模式的内容

    grep 于1974年公开,是文本三剑客中最早出生的(另外两个是 sed、awk),由 Ken Thompson 创造(UNIX 之父)

    grep 基本就是玩正则匹配,一般会玩 grep 的人,正则表达式都比较强

    今天这篇文章主要目的还是为了引起大家对 grep 的兴趣,对于这个上古神器还需要大家自行去查阅相关文档去进一步学习

    废话少说,开始今天的 grep 学习之旅吧!

    grep 基本格式

    grep <选项> <pattern> 文件或目录
    
    • 1

    grep 选项:

    -E:支持扩展正则表达式
    -i:忽略大小写
    -n:将行号打印出来
    -o:只输出匹配内容
    -c:只输出匹配内容的行数
    -B:输出匹配内容的前n行
    -A:输出匹配内容的后n行
    -C:输出匹配内容的前后n行
    -v:输出不匹配的行(取反操作)
    -e:多个操作,例如:grep -e ’A‘ -e 'B'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    基本参数

    下面的文本内容作为演示案例

    passwd.txt

    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    
    
    ntp:x:38:38::/etc/ntp:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    zabbix:x:997:995:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
    #minion2:x:1000:1000::/home/admin:/bin/bash
    #nginx:x:996:994:Nginx web server:/var/lib/nginx:/sbin/nologin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • -E 支持扩展正则表达式

    可以看到这个文本里面有空行,也有 # 开头的注释

    1、将过滤掉空行的内容输出出来

    grep -E -v '^$' passwd.txt 
    
    • 1

    其中,-E 是指支持扩展正则表达式;-v 是指将非空行的内容打印出来;‘^$’ 则表示空行

    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    ntp:x:38:38::/etc/ntp:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    zabbix:x:997:995:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
    #minion2:x:1000:1000::/home/admin:/bin/bash
    #nginx:x:996:994:Nginx web server:/var/lib/nginx:/sbin/nologin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    2、将过滤掉注释的内容输出出来

    grep -E -v '^#' passwd.txt
    
    • 1

    其中 ‘^#’ 指以 # 开头,也就是注释

    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    
    
    ntp:x:38:38::/etc/ntp:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    zabbix:x:997:995:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • -i:忽略大小写

    1、将 sys 过滤出来(不忽略大小写)

    grep  'sys' passwd.txt 
    
    • 1
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    
    • 1

    2、将 sys 过滤出来(忽略大小写)

    grep  -i 'sys' passwd.txt
    
    • 1
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    zabbix:x:997:995:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
    
    • 1
    • 2
    • 3
    • -n:将行号打印出来
    grep  -n 'sys' passwd.txt
    
    • 1
    14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    
    • 1
    • -o:只输出匹配内容

    1、匹配 root (不加 -o)

    grep 'root' passwd.txt
    
    • 1
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    
    • 1
    • 2

    2、匹配 root (加 -o)

    grep -o 'root' passwd.txt
    
    • 1
    root
    root
    root
    root
    
    • 1
    • 2
    • 3
    • 4
    • -c:只输出匹配内容的行数
    grep -c 'root' passwd.txt
    
    • 1
    2
    
    • 1
    • -B:输出匹配内容的前n行

    1、匹配 ‘daemon’,并输出其前两行

    grep -B 2 'daemon' passwd.txt
    
    • 1
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    --
    
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • -A:输出匹配内容的后n行

    1、匹配 ‘root’,并输出其后两行

    grep -A 2 'root' passwd.txt
    
    • 1
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    --
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • -C:输出匹配内容的前后n行
    grep -C 2 'root' passwd.txt
    
    • 1
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    --
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • -v:输出不匹配的行(取反操作)

    1、过滤掉 ‘root’

    grep -v 'root' passwd.txt
    
    • 1
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    
    
    ntp:x:38:38::/etc/ntp:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    zabbix:x:997:995:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
    #minion2:x:1000:1000::/home/admin:/bin/bash
    #nginx:x:996:994:Nginx web server:/var/lib/nginx:/sbin/nologin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • -e:多个操作

    1、将匹配到 ‘root’ 和 ‘daemon’ 打印出来

     grep -e 'root' -e 'daemon' passwd.txt 
    
    • 1
    root:x:0:0:root:/root:/bin/bash
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    
    • 1
    • 2
    • 3
    • 4

    或者可以使用扩展正则式

    grep -E 'root|daemon' passwd.txt
    
    • 1

    正则表达式

    通过使用正则表达式可以进一步扩展 grep 的功能,妥妥的生产利器

    下面给出一些常用的正则表达式

    在这里插入图片描述

    还是以 passwd.txt 作为案例

    • *:匹配前面的字符 0 次或者多次

    1、匹配 ‘ro’

    grep -E 'ro*' passwd.txt
    
    • 1

    可以匹配 ‘r’ 、‘ro’ 、‘roo’

    在这里插入图片描述
    2、匹配 ‘roo’

    grep -E 'roo*' passwd.txt
    
    • 1

    在这里插入图片描述

    3、如果我们要匹配 root ,但是你不知道具体单词,只知道前后,你可以这样

    grep -E 'r*t' passwd.txt
    
    • 1
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    
    • 1
    • 2
    • ^:匹配以某个字符开头的行

    1、匹配以 sy 开头的行

    grep -E '^sy' passwd.txt
    
    • 1
    sync:x:5:0:sync:/sbin:/bin/sync
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    
    • 1
    • 2

    2、匹配注释(以 # 开头)

    grep -E '^#' passwd.txt
    
    • 1
    #minion2:x:1000:1000::/home/admin:/bin/bash
    #nginx:x:996:994:Nginx web server:/var/lib/nginx:/sbin/nologin
    
    • 1
    • 2
    • $:匹配以什么字符结尾的行

    1、匹配以 t 结尾的行(是看行尾,不是字符串尾)

    grep -E 't$' passwd.txt
    
    • 1
    halt:x:7:0:halt:/sbin:/sbin/halt
    
    • 1

    2、匹配以空白开头,空白结尾的行(其实就是空行)

    grep -E '^$' passwd.txt
    
    • 1
    • .*:匹配任意长度的任意字符

    1、匹配包含 ‘no’ 的任意字符

    grep -E 'no.*' passwd.txt
    
    • 1

    在这里插入图片描述

    2、过滤出当前目录下 包含 ‘.txt’ 的文件

    ll | grep -E '*.txt'
    
    • 1
    -rw-r--r--  1 root root  1198 11月 15 11:07 passwd.txt
    -rw-r--r--  1 root root  1598 11月 15 10:12 test.txt
    
    • 1
    • 2
    • [ ]:匹配括号内的字符

    1、匹配 ‘oot’ 、‘rot’

    grep -E '[ro]ot' passwd.txt
    
    • 1

    2、匹配 ‘rt’ 、‘ot’

    grep -E '[roo]t' passwd.txt
    
    • 1
    • [^]:不匹配括号内的字符(取反操作)

    1、匹配到 ‘rt’ 、‘ot’,然后取反(就是取反输出)

    grep -E '[^roo]t' passwd.txt
    
    • 1

    在这里插入图片描述

    • <:锚定单词首部

    记得加上 ’ \ ’ 转义符

    1、匹配出 ‘ro’(以 ro 开头的单词)

     grep -E '\ passwd.txt
    
    • 1

    PS:加上尾部锚定符的话是匹配不出来的,因为文本里没有 ro 这个单词

    grep -E '\' passwd.txt
    
    • 1
    • >:锚定 单词尾部

    1、匹配 ‘ot’ 结尾的单词

    grep -E 'ot\>' passwd.txt
    
    • 1
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    
    • 1
    • 2

    PS:加上首部锚定符的话是匹配不出来的,因为没有 ot 这个单词

    grep -E '\' passwd.txt
    
    • 1
    • {m,n}:表示匹配前面的字符出现至少m次,至多n次

    1、匹配 ‘o’ ‘oo’

    grep -E 'o{1,2}' passwd.txt
    
    • 1

    PS:例子中的正则表示 o 最少是一个,最多是两个(oo)

    在这里插入图片描述

    2、匹配 ‘aa’,‘aaa’或’aaaa’

    grep -E 'a{2,4}' passwd.txt
    
    • 1
  • 相关阅读:
    pnpm install安装element-plus的版本跟package.json指定的版本不一样
    OpenAI 推出 DALL·E 3 配合 ChatGPT 无需复杂提示词即可作画
    B/S架构,java源码,医院绩效管理系统,覆盖了医院绩效管理工作“PDCA”循环的全过程,支持二次开发
    【MySQL核心SQL】
    Mybatis-数据源与连接池
    PHP学习之路——基本语法
    qt day2
    Pygame入门 2022 (1)
    8. 无线体内纳米网:基于蓝牙LE接口的数字ID系统
    Java 进程
  • 原文地址:https://blog.csdn.net/s_alted/article/details/127877477