Linux“文本三劍客”之grep

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

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/98517

(0)
GeniusyqcGeniusyqc
上一篇 2018-05-14
下一篇 2018-05-14

相關推薦

  • Linux 基礎

    Linux 基礎 一.計算機組成及其功能 當今計算機采用馮·諾依曼架構,必須具備的五大基本組成部件,包括: 1.輸入數據和程序的輸入設備 2.記憶程序和數據的存儲器 3.完成數據加工處理的運算器 4.控制程序執行的控制器 5.輸出處理結果的輸出設備 計算機基本組成結構圖 二.Linux的發行版,不同發行版之間的聯系與區別 1.Linux 嚴格來說Linux是…

    2018-05-12
  • 軟件包管理 rpm yum的使用

    軟件包管理 鏈接主要作用是吧各個模塊之間互相引用的部分處理好, 使得各個模塊之間能夠正確的鏈接,分為靜態和動態 靜態鏈接 ?以.a為后綴 ?把程序對應的依賴庫復制到包 ? ? ? ? ? 升級難 需重新編譯 ?占用空間多 遷移容易 動態鏈接 ?以.so為后綴 把依賴加做動態鏈接 ? ?占用空間少 ?升級方便 ? ? ? ? ? 若一個庫被刪,那么所有依賴此庫…

    Linux筆記 2018-04-22
  • 學習筆記(4)

    學習筆記(4)

    Linux筆記 2018-04-22
  • HTTP協議介紹

    HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標準。

    2018-06-19
  • 計算機的組成及其功能、Linux發行版本及其之間區別

    計算機的組成及其功能、Linux發行版本及其之間區別

    Linux筆記 2018-05-11

評論列表(1條)

  • 馬哥教育
    馬哥教育 2018-05-25 11:45

    寫的不錯,加油

欧美性久久久久