天天看點

文本處理工具之grep

1、linux文本處理工具:

    grep:文本過濾工具,可以基于字元串和PATTERN進行過濾

    sed:流編輯器

    awk:linux上的實作為gawk,文本報告生成器,格式化文本。

以上三個工具都會用到正規表達式。

2、正規表達式介紹:

由一類特殊字元及文本所編寫的模式,其中有些字元不表示其字面意義,而是用于表示控制或通配的功能。

正規表達式分類:

    基本正規表達式(BRE)

    擴充正規表達式(ERE)

3、grep:global search regular expression and printout the line;全文搜尋每一行,對字元串及模式進行比對,然後在輸出比對的行。

grep作用:文本搜尋工具,根據使用者指定的“模式(過濾條件)”,對目标文本逐行進行比對檢查,列印比對到的行。

模式(過濾條件):是指由正規表達式的元字元及文本字元所編寫出的過濾條件。

另:

grep:支援基本正規表達式,-E,支援擴充正規表達式

egrep:支援擴充正規表達式,-G,支援基本正規表達式

fgrep:不支援正規表達式元字元,可以和-E、-G一起使用;當無需用元字元去編寫模式時,此指令最好

4、grep指令:

指令格式:

    grep [OPTIONS] PATTERN [FILE...]

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

[OPTIONS]:

    --color=auto:對比對到的文本做高亮顯示

    -i:忽略字元大小寫;

    -o:僅顯示比對到的行

    -v:顯示不能被模式比對到的行

    -E:支援使用擴充的正規表達式

    -q:靜默模式,不輸出任何消息

    -A # :被模式比對的行後面#行顯示出來;after;    

    -B # :被模式比對的行前面#行顯示出來;before;  

    -C # :被模式比對的行前後面#行顯示出來;after;  

5、基本正規表達式元字元:

分類:

    字元比對  . [] [^]

    次數比對  * \? \+ \{m\} \{m,n\}

    位置錨定  \< \>  \b ^ $  

    分組及引用 \( \)

分類具體介紹:

①字元比對:

    .  :比對任意單個字元

    []  :比對指定範圍内的任意單個字元

    [^] :比對制定範圍外的任意單個字元

[[:digit:]] 0-9數字集合

[[:lower:]] 所有小寫字母中的任意一個字元

[[:upper:]] 所有大寫字母中的任意一個字元

[[:alpha:]] 所有大小寫字母中的任意一個字元

[[:alnum:]] 所有字母及數字中的一個字元

[[:punct:]] 所有的标點符号中的任意一個字元

[[:space:]] 空格字元

②次數比對:預設工作于貪婪模式,能比對多長就比對多長;

    * :比對其前面的字元任意次;0次、1次、多次

    .* :比對任意長度的任意字元

    \? :比對其前面的字元0次或1次;前面的字元至多出現一次;

    \+ :比對其前面的字元1次或多次;前面的字元至少出現一次;

    \{m\} :比對其前面的字元m次

    \{m,n\} :比對其前面的字元至少m次,至多n次;

    \{0,n\} :比對其前面的字元至多n次;

    \{m,\} :比對其前面的字元至少m次;

如:grep “x\{2,5\}y" test.txt

③位置錨定:

    ^ :行首錨定;用于模式的最左側,如 ^root

    $ : 行尾錨定;用于模式的最右側,如 root$

    ^PATTERN$ :用PATTERN來比對整行;

    ^$ :空白行

    ^[[:space:]]*$ :比對空白字元任意次;空白行,或包括空白字元的行

    \<或\b :詞首錨定,用于單詞的左側,建議用\<

    \>或\b :詞尾錨定,用于單詞的右側,建議用\>

注意:單詞是指由非特殊字元組成的連續字元(字元串)

④分組及引用

    \( \):将一個或多個字元捆綁在一起,當作一個整體進行處理;如:\(xy\)*ab表示比對xy出現任意次後跟ab字元的行;

注意:分組括号中模式比對到的内容會被正規表達式引擎自動記錄與内部的變量中,這些變量為:

    \1:模式從左側起,第一個左括号與之比對的右括号之間的模式比對到的字元

    \2:模式從左側起,第二個左括号與之比對的右括号之間的模式比對到的字元

    \...:模式從左側起,第...個左括号與之比對的右括号之間的模式比對到的字元

如:

he likes his lover

he loves his lover

she likes her liker

she loves her liker

grep "\(l..e\).*\1 test.txt

後項引用:引用前面的分組括号中的模式所比對到的字元。

6、擴充正規表達式元字元:

分類:

    字元比對  . [] [^]

    次數比對  * ? + {m} {m,n}

    位置錨定  \< \>  \b ^ $  

    分組及引用 ( )

    或

分類具體介紹:

①字元比對:

    .  :比對任意單個字元

    []  :比對指定範圍内的任意單個字元

    [^] :比對制定範圍外的任意單個字元

[[:digit:]] 0-9數字集合

[[:lower:]] 所有小寫字母中的任意一個字元

[[:upper:]] 所有大寫字母中的任意一個字元

[[:alpha:]] 所有大小寫字母中的任意一個字元

[[:alnum:]] 所有字母及數字中的一個字元

[[:punct:]] 所有的标點符号中的任意一個字元

[[:space:]] 空格字元

②次數比對:預設工作于貪婪模式,能比對多長就比對多長;與基本正規表達式的差別是少了轉義字元"\".

   * :比對其前面的字元任意次;0次、1次、多次

   .* :比對任意長度的任意字元

    ? :比對其前面的字元0次或1次;前面的字元至多出現一次;

    + :比對其前面的字元1次或多次;前面的字元至少出現一次;

    {m} :比對其前面的字元m次

    {m,n} :比對其前面的字元至少m次,至多n次;

    {0,n} :比對其前面的字元至多n次;

    {m,} :比對其前面的字元至少m次;

如:grep “x{2,5}y" test.txt

③位置錨定:

    ^ :行首錨定;用于模式的最左側,如 ^root

    $ : 行尾錨定;用于模式的最右側,如 root$

    ^PATTERN$ :用PATTERN來比對整行;

    ^$ :空白行

    ^[[:space:]]*$ :比對空白字元任意次;空白行,或包括空白字元的行

    \<或\b :詞首錨定,用于單詞的左側,建議用\<

    \>或\b :詞尾錨定,用于單詞的右側,建議用\>

注意:單詞是指由非特殊字元組成的連續字元(字元串)

④分組及引用 與基本正規表達式的差別是少了轉義字元"\".

    ( ):将一個或多個字元捆綁在一起,當作一個整體進行處理;如:\(xy\)*ab表示比對xy出現任意次後跟ab字元的行;

注意:分組括号中模式比對到的内容會被正規表達式引擎自動記錄與内部的變量中,這些變量為:

    \1:模式從左側起,第一個左括号與之比對的右括号之間的模式比對到的字元

    \2:模式從左側起,第二個左括号與之比對的右括号之間的模式比對到的字元

    \...:模式從左側起,第...個左括号與之比對的右括号之間的模式比對到的字元

如:

he likes his lover

he loves his lover

she likes her liker

she loves her liker

grep -E "(l..e).*\1 test.txt

後項引用:引用前面的分組括号中的模式所比對到的字元。

⑤或 a|b

a|b :表示比對整個左側的a或整個左側的b

如:c|Cat :表示c或者Cat

(C|c)at:表示Cat或者cat

常用的文本處理指令(7-12)

7、cut指令:文本截取指令

cut:從檔案的每一行中移除片段

 格式:cut OPTION... [FILE]...

option:

    -d:定義以什麼為分隔符,預設為空格

    -f:保留的字段

    -f # :保留指定字段

    -f #-# :保留字段範圍

    -f #,# :保留特定列字段

如:

[[email protected] dev]# cut -d: -f1,7 /etc/passwd | head -1

root:/bin/bash

[[email protected] dev]# 

8、wc指令:統計每個檔案的行數、單詞數、位元組數

格式:wc [OPTION]... [FILE]...

[OPTION]

    -l:統計行數

    -w:統計多少個單詞

    -c:統計位元組數

如:

[[email protected] dev]# wc /etc/fstab 

 11  54 465 /etc/fstab

[[email protected] dev]# 

9、sort指令:文本檔案的排序行

sort [OPTION]... [FILE]...

[OPTION]

    -t char :指定分隔符char

    -k # :用于排序比較的字段

    -n :基于數值大小排序,而非字元

    -f:忽略字元大小寫

    -r:逆序排列

    -u:重複的行隻保留一份,重複行是指連續且相同的行;

如:

[[email protected] dev]# sort -t : -k 3 -n  /etc/passwd | head -5

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

[[email protected] dev]# 

10、uniq指令:報告或省略重複的行

  uniq [OPTION]... [INPUT [OUTPUT]]

OPTION:

    -c:統計每一行重複出現的次數

    -u:隻顯示不存在重複的行

    -d:隻顯示存在重複的行

如:

[[email protected] dev]# cut -d: -f7 /etc/passwd | uniq 

11、diff指令:逐行比較檔案中的内容:

 diff [OPTION]... FILES

生成更新檔檔案:diff /path/to/older /path/to/newfile >/patch_file  

12、patch指令:向檔案打更新檔

 patch -i 更新檔檔案 老檔案

或patch 老檔案 < 更新檔檔案 

轉載于:https://blog.51cto.com/10631377/1973551

繼續閱讀