【Linux】文本處理grep


1. 常用文本處理工具

Linux上文本處理三劍客:

  • grep:文本過濾工具(pattern模式)工具;
  • sed:stream editor,流編輯器,文本編輯工具;
  • awk:Linux上的實現爲gawk,文本報告生成器(格式化文本)

正則表達式:Regular Expression,REGEXP,由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示其字面意義,而是用於表示控制或通配的功能。

分兩類:
基本正則表達式:BRE
擴展正則表達式:ERE


2. grep命令

grep:Global search Regular expression and print out the line

作用:文本搜索工具,根據用戶指定的“模式(過濾條件)”對目標文本逐行匹配檢查;打印匹配到行;

模式:由正則表達式的元字符及文本字符所編寫的過濾條件

正則表達式語法:
grep [OPTIONS] PATTERN [FILE...]

OPTIONS:

  • - -color = auto:對匹配到的文本着色後高亮顯示;
  • - i:ignorance,忽略字符的大小寫;
  • - o:僅顯示匹配到的字符串本身;
  • - v:- -invert -match:顯示不能被模式匹配到;
  • - E:支持使用擴展的正則表達式;
  • - q,- -quiet:靜默模式,不輸出任何信息;
  • - A #:after,後#行
  • - B #:before,前#行
  • - C #:context,前後各#行

3. 基本正則表達式元字符

3.1 字符匹配

匹配文本中指定的字符。

  • .:匹配任意單個字符;
  • []:匹配指定範圍內的任意單個字符;
  • [^]:匹配指定範圍外的任意單個字符;
  • [:digit:]:表示所有的數字;
  • [:alpha:]:表示所有的字母(不區分大小寫);
  • [:alnum:]:表示所有的數字;
  • [:lower:]:表示所有的小寫字母;
  • [:upper:]:表示所有的大寫字母;
  • [:punct:]:表示所有的標點符號;
  • [:space:]:表示所有的空白字符;
  • [0-9]:任意單個數字;
  • [a-z]:任意單個字母。

3.2 次數匹配

用於在要指定次數的字符後面,用於指定前面的字符要出現的次數。

  • *:匹配前面的字符任意次;
  • .*:任意長度的任意字符;
  • ?:匹配其前面的字符0或1次,即前面的可有可無;
  • +:匹配其前面的字符至少1次;
  • {m}:匹配前面的字符m次;
  • {m,n}:匹配前面的字符至少m次,至多n次;
  • {0,n}:匹配前面的字符至多n次;
  • {m,}:匹配前面的字符至少m次;

3.3 位置錨定

對特定位置進行定位。

  • ^:行首錨定,用於模式的最左側;
  • $:行首錨定:用於模式的最右側;
  • ^PATTERN$:用於模式匹配整行;
  • ^$:空行,不包含有空格的行;
  • ^[[:space:]]*$:空行,但包含有空格的行;
  • <或\b:詞首錨定,用於單詞模式的左側;
  • >或\b:詞首錨定,用於單詞模式的右側;
  • \<PATTERN\>:匹配整個單詞。

3.4 分組及引用

分組是指將一個或多個字符捆綁在一起,當作一個整體進行處理,其符號爲:
\(\)
如:(xy)*ab表示xy這個整體可以出現任意次。

注意:分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄於內部的變量中,這些變量爲:
\1:模式從左側起,第一個括號以及與之匹配的右括號之間的模式所匹配到的字符;
\2:模式從左側起,第二個括號以及與之匹配的右括號之間的模式所匹配到的字符;

後向引用:引用前面的分組括號中的模式所匹配到的字符。


4. 例子

  1. 顯示/etc/passwd文件中不以/bin/bash結尾的行。
    grep -v /bin/bash$ /etc/passwd
    在這裏插入圖片描述
  2. 找出/etc/passwd文件中,包含二位數字或者三位數的行。
    grep \<[0-9]\{2,3\}\> /etc/passwd
  3. 顯示/proc/meminfo文件中以大寫或小寫S開頭的行;用三種方式實現。
    grep -i ^s /proc/meminfo
    grep -i ^S /proc/meminfo
    grep ^[Ss] /proc/meminfo
    grep -E ^(S|s) /proc/meminfo
    在這裏插入圖片描述
  4. 使用echo輸出一個絕對路徑,使用egrep取出路徑名,類型執行dirname /etc/passwd/的結果。
    echo /etc/passwd/|grep -oE ^/[^/]+
    在這裏插入圖片描述
  5. 找出ifconfig中的ip地址。要求結果只顯示IP地址。
    ifconfig ens33 | grep -E inet[[:space:]] | cut -d' ' -f10
    在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章