1. 程式人生 > >Linux 文本處理劍客grep

Linux 文本處理劍客grep

同構 標點符號 元字符 單詞 str 作文 行處理 tro shell

grep(grep: Global search REgular expression and Print out the line)用作文本搜索工具,旨在根據其Pattern逐行打印匹配到的行。其中pattern為由正則表達式元字符及文本字符所編寫的過濾條件。用法相對簡單即grep[OPTIONS] PATTERN [FILE]。
應用比如:
一、1.想要匹配文件中含有r..t,方法可以grep -i ‘r..t‘ /文件路徑。不難發現其中包含兩部分1是選項包括哪些2是pattern. pattern中重要組成部分則為元字符和文本字符共同構成一個正則表達式。
2.例如想要匹配r與t之間只有兩位字母或數字,則變pattern
為[:alnum:]。
grep -i ‘r[:alnum:][:alnum:]t‘即可。類似的pattern中字符匹配如
. 匹配任意單個字符
[] 匹配指定範圍內的任意單個字符
[^] 匹配指定範圍外的任意單個字符
[:alnum:] 字母和數字
[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母 [:upper:] 大寫字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的範圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)
[:digit:] 十進制數字 [:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號
如此便實現了r、t中間放置兩位不明字符到兩位字母或數字類字符的過程。
二、如若有r、t的pattern 出現字符次數需求時,如需要匹配r後任意次的字母的篩選pattern。將如下grep -i ‘r [:alnum:] t‘.如果只想出現一次則為grep -i ‘r [:alnum:] ?t‘。諸如此類顯示次數的元字符如下:

  • 匹配前面的字符任意次,包括0次
    .
    任意長度的任意字符
    \? 匹配其前面的字符0或1次
    + 匹配其前面的字符至少1次
    {n} 匹配前面的字符n次
    {m,n} 匹配前面的字符至少m次,至多n次

    {,n} 匹配前面的字符至多n次
    {n,} 匹配前面的字符至少n次
    用於指定前面一類或該個字符出現的次數。以上像?+?由於對shell來講有特殊意義。所以用反斜線\則表示轉義,取其統配字符中的意義而不取之前字符的意義,而是送給grep的解釋。
    具體次數可以使用{n}表示前面字符出現0-n次;{m,n}則表示m-n次。
    三、再次提出需求,需要尋找r在行首的或者t在行位的,則需要進行行首或尾的錨定。則有
    ^ 行首錨定,用於模式的最左側
    $ 行尾錨定,用於模式的最右側
    ^PATTERN$ 用於模式匹配整行
    ^$ 空行
    ^[[:space:]]*$ 空白行
    \< 或 \b 詞首錨定,用於單詞模式的左側
    \> 或 \b 詞尾錨定;用於單詞模式的右側
    \<PATTERN\> 匹配整個單詞
    例如:grep -i ‘crtl r [:alnum:] ?t‘
    如果此時想進行數據分析統計數據個數則用管道 | wc -l統計出幾個字符
    四、正則表達式的分組 包括字符串連在一起表示一個的如下

    分組:() 將一個或多個字符捆綁在一起,當作一個整體進行處理,如:(root)+
    分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式為: \1, \2, \3, ...
    \1 表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
    如: (string1+(string2))
    \1 :string1+(string2)

    \2 :string2
    後向引用:引用前面的分組括號中的模式所匹配字符,而非模式本身
    或者:|
    如:a|b: a或b C|cat: C或cat (C|c)at:Cat或cat
    而crtl r這個鍵位還是比較好用的,可以模糊尋找/檢索ls之類之前輸入過的文件 crtl e 及alt b

Linux 文本處理劍客grep