1. 程式人生 > >Linux文本處理工具之grep

Linux文本處理工具之grep

目錄 分組 lin col block grep 指定 格式 需要

文本處理三劍客之GREP

文本過濾工具:glob 用於實現bash中的文件名通配

  • 通配符:

    *:任意長度的任意字符
    ?:任意單個字符
    [ ]:明確指明匹配範圍內的單個字符

    • [abc]:abc中的任意一個
    • 註:要匹配通配符本身,需要使用%轉義
  • 常用的字符集合表示法:
    • [:alpha:]:任意字母
    • [:alnum:]:任意數字和字母
    • [:blank:]:任意空白字符
    • [:cntrl:]:任意控制字符
    • [:digit:]:任意數字
    • [:lower:]:任意小寫字母
    • [:upper:]:任意大寫字母
    • [:space:]:任意空格

      例如:顯示/var目錄下,以l開頭,以小寫字母結尾,且中間至少出現一位數字的文件或目錄

    • ls -d /var/l[[:digit:]][[:lower:]]

      grep:全局搜索正則表達式並顯示出來(文本過濾工具)

      grep:基本正則表達式
      egrep:擴展正則表達式

作用:文本搜索,根據用戶指定的內容,對目標文件進行逐行匹配檢查,打印匹配到的行

  • 內容(模式):由正則表達式字符和文本符所編寫的過濾條件
  • 正則表達式:由一類特殊字符所編寫的模式,有些字符不表示字符本身的含義,而表示控制或通配
  • 元字符:表示特殊含義的字符

    grep的使用方法:

  • 格式:grep [選項] 模式 目錄或文件
  • --color=auth:對匹配到的內容加顏色顯示
  • -m #:匹配#次後停止
  • -n:顯示匹配的行行數
  • -c:統計匹配到的行的行號
  • -v:顯示不能匹配到的行
  • -i:匹配時忽略字符大小寫
  • -o:僅顯示匹配到的字符
  • -q:靜默模式
  • -A#:顯示匹配到的行和後#行
  • -B#:顯示匹配到的行和前#行
  • -C#:顯示匹配到的行和前後各#行
  • -w:匹配整個單詞
  • -E:使用擴展正則表達式
  • -F:使用fgrep
  • -f file:根據模式文件中的內容去匹配

基本正則表達式的元字符:使用引號引起來

  • 字符匹配:

    .:任意單個字符
    []:匹配指定範圍內的任意單個字符
    [^]:匹配指定範圍之外的任意單個字符

  • 次數匹配:

    :匹配前面的字符任意次數
    .
    :匹配任意長度的任意字符
    \?:匹配前面的字符0次或1次,即前面的字符可有可無

    \+:匹配前面的字符至少出現一次
    \{m\}:匹配前面的字符m次
    \{m,n\}:匹配前面的字符m到n次
    \{m,\}:匹配前面的字符至少出現m次
    \{,m\}:匹配前面的字符至多出現m次

  • 位置錨定:

    ^:匹配的字符出現在行首
    $:匹配的字符出現在行尾
    ^pattern$:用於整行匹配
    ^$:空行
    ^[[:space:]]$:空白行
    \<或\b:詞首錨定,用於單詞模式左側
    \>或\b:詞尾錨定,用於單詞模式的右側
    \<pattern\>:匹配整個單詞

  • 分組:

    \(\):把括號中的內容分組
    \(xy\)*ab:匹配ab前面的xy出現任意次數

  • 後向引用:引用前面分組括號中的模式所匹配到的內容
    • 分組括號中的模式所匹配到的內容,會被正則表達式引擎記錄在內部變量中,這些變量被命名為\1,\2,\3……
      • -n:把左側起第n個左括號以及與之匹配的右括號之間的模式所匹配到的字符
      • 例:(str1+(str2)*)

        \1:str1+(str2)*
        \2:str2

  • 或者:

    \|:

  • 實例:

    a\|b:a或者b
    C\|cat:C或者cat
    \(C\|c\)at:Cat或者cat

擴展正則表達式:egrep

選項與基本正則表達式相同

egrp的元字符:

  • 字符匹配:同grep
  • 次數匹配:同grep,但是不需要轉義
  • 位置錨定:同grep
  • 分組:小括號不需要轉義
  • 後向引用
  • 或者:| 不需要轉義

fgrep:不支持正則表達式,僅僅找給定的字符串

練習:

  1. 顯示/proc/meminfo文件中以大小寫s開頭的行

    grep -i ‘^s.‘ /proc/meminfo
    grep ‘[Ss].
    ‘ /proc/meminfo

  2. 顯示/etc/passwd文件中不以bash結尾的行

    grep -v ‘.*bash$‘ /etc/passwd

  3. 顯示CentOS7中的/etc/grub2.cfg文件中,至少以一個空白字符開頭,且後面有非空白字符的行

    grep -E "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg

Linux文本處理工具之grep