文本處理三劍客之---grep系

在前面介紹了linux中重要的幾個文本編輯工具,如vim/vi、nano等等,它們均可以進行文本文件內容的編輯操做,接下來介紹的是文本的處理工具:
linux

主要有grep家族,sed,awk等等,還有一些其餘的處理工具諸如cut sort等等了;做爲文本處理工具的三劍客之一,grep可謂功能強大。grep 全稱是 (Global search REgular expression and Print line)git

做用是:文本搜索工具,根據用戶指定的文本模式(正則表達元字符以及正常字符組合而成)對目標文件進行逐行搜索,顯示能匹配到的行;    正則表達式

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

grep家族裏根據元字符的數量及功能不一樣又分爲基本正則表達式(grep)和拓展正則表達式(egrep)express

用法上有些許的差別,可是也能互通,好比 grep -E 就至關於egrep了vim

 注意:grep默認僅支持基本的正則表達式
app

     egrep默認僅支持擴展的正則表達式ide

     fgrep默認不開啓正則表達式引擎工具

用法格式:grep [options] PATTERN [FILE...]
ui

【經常使用選項】:

        -i, --ignore-case

           忽略PATTERN 和輸入文件中的大小寫的分別。

        -v, --invert-match

           改變匹配的意義,只選擇不匹配的行。反向匹配 

        -c,--count

           計數,統計匹配PATTERN

        -o, --only-matching

           關閉貪婪模式  只顯示匹配的行中與 PATTERN 相匹配的部分。    

        -q, --quiet, --silent

           不輸出任何匹配結果


        -E,--extended-regexp:擴展的正則表達式,至關於egrep

        -F,--fixed-strings, --fixed-regexp: 至關於fgrep

        -G,--basic-regexp: 基本的正則表達式 ,egrep -G = grep

        -P,--perl-regexp: 使用PCRE引擎


        -A NUM, --after-context=NUM   在顯示匹配PATTERN的行的同時 顯示其後面的NUM行

        -B NUM, --before-context=NUM  在顯示匹配PATTERN的行的同時 顯示其前面的NUM行

        -C NUM, --before-context=NUM  在顯示匹配PATTERN的行的同時 顯示其前面和後面各NUM行

  

PATTERN:指的是過濾條件,正則表達式由兩種基本字符類型組成:原義(正常)文本字符和元字符。   文本字符呢,就是表明其自己含義的字符這個不用作太多解釋;

  而所謂元字符就是指那些在正則表達式中具備特殊意義的專用字符,不表示其字面意義,而

用於額外功能性描述。這些元字符會被正則表達式的引擎解釋爲特殊含義;   

     

基本的正則表達式元字符:

1.字符匹配:

  . : 匹配任意單個字符  grep .x /etc/passwd 只要包含x就做匹配

  [] : 匹配指定範圍內的任意單個字符  grep [xhm] /etc/passwd 匹配文件中帶有x或h或m的字段

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

這裏相似於前面提到的Globbing通配字符,例如[[:digit:]]表示的匹配單個數字等等;這裏就不做贅述;


2.次數匹配:該類字符以前的那個字符能夠出現的次數

  *:前面的字符能夠出現任意次(0,1或屢次) grep 'x*y' /FILE 文件中y以前出現x的次數不限

  \?:前面的字符無關緊要(0或1次) grep  'x\?y' /FILE 文件中y以前的x最多出現1次

  \+:前面的字符至少出行1次(1次或屢次) grep  'x\+y' /FILE 文件中y以前的x最少出行1次

  \{m\}:前面的字符必須出現m次    grep  '\{2\}' /FILE 文件中y以前的x只能出現2次

  \{m,n\}:前面的字符出現至少出現m次 至多n次 因此一般來說 m<n

  \{,n\}:前面的字符至少出行0次 至多出現n次

  \{m,\}:前面的字符至少出現m次,至多不限


 在正則表達式中,表示任意長度,任意字符的方式是: .*

 grep '.*y' /FILE  文件中y以前不管出現什麼字符都匹配


3.位置錨定字符:

 行錨定:

  行首錨定:^ grep '^s' /FILE  文件FILE中以s開頭的行

  行尾錨定:$ grep 's$' /FILE  文件中以s結尾的行

 字錨定:

  字首錨定:\< 或者 \b 

  字尾錨定:\> 或者 \b


  grep -o '\<y.*c\>' whj.txt 顯示whj.txt中 y字母開頭c字母結尾的字


  \b:舊版本中的錨定方法;

**對於正則表達式的引擎來講,所謂的字是由非特殊字符組成的連續字符串;

4.分組與引用字符:


 \(PATTERN\) 將此PATTERN所匹配到的字符看成一個不可分割 的總體來處理


 在正則表達式引擎中,有一系列的內置變量,這些變量會保存全部分組內的字符信息,用於後向引  用,這些變量依次是:

 \1 \2 \3 ……

 例如 在PATTERN1\(PA2\)PA3\(PA4\)... 之中,\1:pattren2 \2:pattern4...

 也就是\1表示第一組小括號內的PATTERN匹配到的字符;...以此類推


 例:找出在/etc/passwd 中用戶的uid和gid相同的用戶帳戶;

    grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd

5.或:

\| 


注意:\|將其左右兩邊的字符串看成總體對待;

A\|american : A或amarican


例題

 請找出ifconfig的執行結果中,數字在100-255之間的三位數

 第一位:1  或者      2

 第二位:0-9或者 0-4 或者  5

 第三位:0-9或者 0-9 或者 0-5


 ifconfig | grep '\<\(1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>'


 找出0-255:

 ifconfig | grep '\<\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>'


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

默認狀況下,grep命令後只容許有一個PATTERN,若是想要在一次grep搜索過程當中寫多個PATTERN 須要使用-e選項;每一個-e 只能跟一個PATTERN


或者將所須要的PATTERN寫入到一個文件中保證每行只有一個PATTERN,這樣可使用-f FILE 來實現多PATTERN匹配

   egrep:

    grep [options] PATTERN [FILE...]

      擴展的正則表達式元字符

       1.字符匹配

         .

         []

         [^]

       2.次數匹配

         *

         ?

         +

         {m}

         {m,n}

         {m,}

         {0,n}

        3.位置錨定

          ^

          $

          \<,\b

          \>,\b

        4.分組和引用

         (pattern)

         \1  \2  \3 ...

        5.或:

          |

       以上能夠看出,egrep相比grep 少了不少'\',可是注意位置錨定中的字首字尾錨定不能省略'\'


   fgrep

      不使用PATTERN搜索引擎,因此 PATTERN全部的字符都被看成文本字符來處理;

其餘的文本處理命令

  wc:

   wc [opt]... [file]...

     -l:只顯示行數

     -w:只顯示字數

     -c:只顯示字符數

     -m:

  cut:

   把文件某一行的某些字段移除;

   可以被cut命令修剪的文件,通常都是具備必定結構或格式的文本文檔:例如/etc/passwd


   【OPT】

    -d,--delimeter=DELIM

      指定在修剪時,所依賴的分隔符 默認 是空白字符

    -f,--filed=LIST

      根據定義的分隔符來指定字段的編號

      地址定界的使用方法:

       #:選擇被指定的單個字段

       #,#:離散的多個被指定的單個字段

       #-#: 連續的多個被指定的字段


     --output-delimeter=STRING :指定輸出分隔符

  awk:

    awk -F "DELIMETER" '[/PATTERN/]{print $1,$2,...$NF}

      -F "DE" :指定字段分隔符,默認爲空白字符;

      $1 $2...$NF : 根據字段分割符切割出來的文本片斷都存放在相應的內部變量中;

  sort:

    將文本文件按行排序,默認排序規則是按照ASCII表進行,這個排序標準能夠修改;

    -r  逆序排序.

    -R  隨機排序,這種隨機算法很是簡單,不適用於複雜環境;

    -u  重複出現的行,只保留一行,連續且徹底相同的行纔是重複的行,祛重.

    -n  按數值大小進行排序.

    -t  指定字段分隔符.

    -k  指明根據哪一個關鍵字段進行排序,通常和-t同時使用.


  uniq:

    -d  只顯示重複出現的行,並且每一組重複的行只顯示一行

    -u  只顯示不重複的行

    -c  在每行的前面 之前綴的方式顯示重複行的重複次數


  diff:比較兩個文件的差別性

   同一個文件的不一樣修改版本。打補丁:


  patch:apply changes to files

    patch [-R][-i patchfile] [file]



例題:

有一個文件a.txt,內容以下:

  12 314 56 78

  24 56 8 90

  76 11 67 87

  100 89 78 99

找出文件中的最大和最小值;

最大值:cat a.txt | tr ' ' '\n' | sort -nr | head -1

最小值:cat a.txt | tr ' ' '\n' | sort -n | head -1

相關文章
相關標籤/搜索