天天看點

Linux之文本處理三劍客之grep

Linux之文本處理三劍客介紹

sed sream eidtor 行編輯器,也能實作文本過濾功能

grep

通配原理:grep程式依據,使用者給出的模式對标準輸入輸入的資料流逐個比對檢測,并将比對到的字元串以行的方式顯示到标準輸出

模式:PATTERN,由正規表達式字元或純文字字元所編寫的過濾條件,注意純文字字元用grep比對也會調用正規表達式引擎,不如直接用fgrep

正規表達式字元:Regular Expression,簡寫regex,regexp,RE表示,由不表示字面意義的特殊字元表示,有“基本正規表達式字元”“擴充正規表達式字元”

與grep相關的工具:

    grep,支援基本正規表達式 BRE,Basic Regular Expression

    egrep,支援擴充正規表達式 ERE,Extension Regular Expression

    fgrep,不支援正規表達式 FRE Fast Regular Expression ,最為高效的精确比對算法實作字元比對

能夠調用正規表達式的工具:

    grep,egrep,sed,awk,perl

    1)正規表達式的元字元不同

    2)各自調用不同的正規表達式引擎

    3)各自實作的算法不一樣

    4)perl支援較為強大的正規表達式引擎,一般寫程式需要用到正規表達式,都會調用perl的正規表達式,如果需要使用perl的正規表達式,需要在編譯時指明 --pcre,就能實作正規表達式解析和比對檢查。

正規表達式引擎:把模式套到文本,檢查表達式比對與否

grep指令

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<code>1、第一步,擷取指令的類型</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># type grep </code>

<code>grep</code> <code>is aliased to `</code><code>grep</code> <code>--color=auto'</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># which --skip-alias grep</code>

<code>/usr/bin/grep</code>

<code>2、用外部指令擷取幫助的方法,擷取</code><code>grep</code><code>指令的幫助</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># grep --help</code>

<code>Usage: </code><code>grep</code> <code>[OPTION]... PATTERN [FILE]...</code>

<code>通過模式搜尋每一個文本或标準輸入的資料,顯示由PATTERN比對到的字串所在的行。</code>

<code>預設使用BRE比對</code>

<code>Regexp selection and interpretation:</code>

<code>-E, --extended-regexp </code><code>#ERE</code>

<code>-F, --fixed-strings   </code><code>#FRE</code>

<code>-G, --basic-regexp    </code><code>#BRE</code>

<code>-P, --perl-regexp     </code><code>#PRE</code>

<code>-i, --ignore-</code><code>case</code>     <code>#比對時忽略PATTERN中字元大小寫</code>

<code>Miscellaneous:</code>

<code> </code><code>-</code><code>v</code><code>, --invert-match   </code><code>#僅顯示不能夠PATTERN比對到的行</code>

<code> </code> 

<code>Output control:</code>

<code>-n,--number           </code><code>#顯示比對到的行的行号</code>

<code>-c, --count           </code><code>#顯示比對到的行的行數</code>

<code>-o, --only-matching   </code><code>#僅顯示比對到的字元串</code>

<code>-q, --quiet, --silent </code><code>#靜默模式</code>

<code>Context control:</code>

<code>-B, --before-context=NUM  </code><code>#顯示比對到的行及行前的NUM行</code>

<code>-A, --after-context=NUM   </code><code>#顯示比對到的行及行後的NUM行</code>

<code>-C, --context=NUM         </code><code>#顯示比對到的行及行前後各NUM行</code>

<code>--colour=auto             </code><code>#将比對到的文本高亮顯示</code>

grep選項注釋

--colour=auto       #将比對到的文本高亮顯示

1、自動高亮顯示文本

<a href="https://s4.51cto.com/wyfs02/M01/9D/5F/wKiom1l--daxjp0RAAAoMosaQaU262.png" target="_blank"></a>

2、Rehl7系統自動添加别名,Rehl 6需要定義‘grep别名’方能簡化grep比對時高亮顯示的過程

<code>[root@izpo45bh60h6bsz ~]</code><code># alias</code>

<code>alias</code> <code>egrep</code><code>=</code><code>'egrep --color=auto'</code>

<code>alias</code> <code>fgrep</code><code>=</code><code>'fgrep --color=auto'</code>

<code>alias</code> <code>grep</code><code>=</code><code>'grep --color=auto'</code>

-v 不顯示被PATTERN比對到的字元串所在的行,隻顯示其他行

<code>[root@izpo45bh60h6bsz ~]</code><code># vim b.txt</code>

<code>a 1 b c</code>

<code>c 3 b c</code>

<code>d 10 c e</code>

<code>o 110 d f</code>

<code>l 2 f s</code>

<code>E 99 A D</code>

<code>A 77 D 1</code>

<code>SD 45 DF DF</code>

<code>MEI 66 AD OOO</code>

1、顯示被PATTERN比對到的字元串所在的行

<a href="https://s5.51cto.com/wyfs02/M00/9D/5F/wKioL1l_ADLwBCnsAAAHYPuXjKk101.png" target="_blank"></a>

2、顯示模式不能比對的行

<a href="https://s3.51cto.com/wyfs02/M02/9D/5F/wKiom1l_AJrwWus-AAAOYoHzgoc059.png" target="_blank"></a>

- q,quit 比對到的内容不顯示到标準輸出,一般用于使用"指令的執行狀态結果"

1、如果gentoo使用者存在就顯示OK

<code>[root@izpo45bh60h6bsz ~]</code><code># who | grep -q '^gentoo\b' &amp;&amp; echo 'OK'</code>

*邏輯運算中:與運算:左側為真,才會繼續向後執行

-i  忽略PATTERN中特殊字元的大小寫

<code>grep</code> <code>-i </code><code>'how'</code> <code>a.txt</code>

<a href="https://s2.51cto.com/wyfs02/M02/9D/5F/wKioL1l_A5mDt-dTAAAJxYqalio765.png" target="_blank"></a>

-C,context  顯示比對到的行及前後各NUM行

<code>[root@izpo45bh60h6bsz ~]</code><code># grep -C 2 -i 'ipvs' /boot/config-3.10.0-514.6.2.el7.x86_64 </code>

<code>CONFIG_NETFILTER_XT_MATCH_HL=m</code>

<code>CONFIG_NETFILTER_XT_MATCH_IPRANGE=m</code>

<code>CONFIG_NETFILTER_XT_MATCH_IPVS=m</code>

<code>CONFIG_NETFILTER_XT_MATCH_LENGTH=m</code>

<code>CONFIG_NETFILTER_XT_MATCH_LIMIT=m</code>

-A,after 顯示比對到的行及後NUM行

<code>[root@izpo45bh60h6bsz ~]</code><code># grep -A 2 'root' /etc/passwd</code>

<code>root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>

<code>bin:x:1:1:bin:</code><code>/bin</code><code>:</code><code>/sbin/nologin</code>

<code>daemon:x:2:2:daemon:</code><code>/sbin</code><code>:</code><code>/sbin/nologin</code>

<code>....</code>

-B,before 顯示比對到的行及前NUM行

<code>[root@izpo45bh60h6bsz ~]</code><code># grep -B 2 'root' /etc/passwd</code>

<code>root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code> <code>#此處為首行,之前沒有,是以顯示不出來</code>

<code>--</code>

<code>halt:x:7:0:halt:</code><code>/sbin</code><code>:</code><code>/sbin/halt</code>

<code>mail:x:8:12:mail:</code><code>/var/spool/mail</code><code>:</code><code>/sbin/nologin</code>

<code>operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>

-o,only-match 僅顯示比對到的字元串

<code># grep -o 'root' /etc/passwd</code>

<a href="https://s1.51cto.com/wyfs02/M01/9D/60/wKiom1l_BQ2Al4ZLAAAMBTEa8Pc038.png" target="_blank"></a>

-n,number 顯示比對到的行的行号

<code>[root@izpo45bh60h6bsz ~]</code><code># grep -n 'root' /etc/passwd</code>

<code>1:root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>

<code>10:operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>

<code>29:dockerroot:x:995:992:Docker User:</code><code>/var/lib/docker</code><code>:</code><code>/sbin/nologin</code>

<code>41:hello:x:1008:1008::</code><code>/root/hello</code><code>:</code><code>/bin/bash</code>

<code>42:hello1:x:1009:1009::</code><code>/root/hello</code><code>:</code><code>/bin/bash</code>

<code>43:hello2:x:1010:1010::</code><code>/root/hello</code><code>:</code><code>/bin/bash</code>

<code>47:vuser:x:994:990::</code><code>/var/ftproot</code><code>:</code><code>/bin/bash</code>

<code>48:gentoo:x:1016:1016::</code><code>/root/gentoo</code><code>:</code><code>/bin/bash</code>

<code>49:slackware:x:1017:1017::</code><code>/root/slackware</code><code>:</code><code>/bin/tcsh</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># awk '/root/{print NR,$0}' /etc/passwd</code>

<code>1 root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>

<code>10 operator:x:11:0:operator:</code><code>/root</code><code>:</code><code>/sbin/nologin</code>

<code>29 dockerroot:x:995:992:Docker User:</code><code>/var/lib/docker</code><code>:</code><code>/sbin/nologin</code>

<code>41 hello:x:1008:1008::</code><code>/root/hello</code><code>:</code><code>/bin/bash</code>

<code>42 hello1:x:1009:1009::</code><code>/root/hello</code><code>:</code><code>/bin/bash</code>

<code>43 hello2:x:1010:1010::</code><code>/root/hello</code><code>:</code><code>/bin/bash</code>

<code>47 vuser:x:994:990::</code><code>/var/ftproot</code><code>:</code><code>/bin/bash</code>

<code>48 gentoo:x:1016:1016::</code><code>/root/gentoo</code><code>:</code><code>/bin/bash</code>

<code>49 slackware:x:1017:1017::</code><code>/root/slackware</code><code>:</code><code>/bin/tcsh</code>

-c,count 顯示比對到的行的行數,相當于, COMMAND | wc -l

<code>[root@izpo45bh60h6bsz ~]</code><code># grep -c 'root' /etc/passwd </code>

<code>9</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># grep  'root' /etc/passwd | wc -l</code>

基本正規表達式字元

    字元比對

    比對次數

    位置錨定

字元比對

    1) .  比對任意單個字元, .. 比對兩個字元

    2)[] 比對指定範圍内的任意單個字元 (同glob)

    3)[^] 比對範圍之外的任意單個字元 (同glob)

使用示例

<code>[root@izpo45bh60h6bsz ~]</code><code># vim a.txt #vim是一個文本編輯指令,進入後按i鍵,才可編寫文本,編寫完畢後。按esc鍵,再按shift 加 : 鍵,輸入wq加Enter鍵即可。</code>

<code>how are you?</code>

<code>hwo old are you?</code>

<code>HOW ARE YOU?</code>

<code>HWO OLD ARE YOU?</code>

    .  比對任意單個字元

<code># grep 'h.w' a.txt</code>

<code># grep -i 'h.w' a.txt #比對時,不區分字元大小寫</code>

    .. 比對兩個字元

<code># grep 'r..t' a.txt</code>

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

1)比對任意單個小寫字母

<code># grep 'h[a-z]' a.txt  #glob通配時,為所有的字母</code>

<code># grep 'h[[:lower:]]' a.txt</code>

<a href="https://s3.51cto.com/wyfs02/M02/9D/5E/wKiom1l-8OHTGqDxAAAKLBvZFHY753.png" target="_blank"></a>

<a href="https://s2.51cto.com/wyfs02/M00/9D/5D/wKioL1l-8JTQw1VjAAAJVoKEkEA703.png" target="_blank"></a>

2)比對單個大寫字母

<code># grep '[A-Z]W' a.txt</code>

<code># grep '[[:upper:]]W' a.txt</code>

<a href="https://s2.51cto.com/wyfs02/M01/9D/5C/wKiom1l-5qmyk5wVAAAJ6zj1Ygs574.png-wh_500x0-wm_3-wmp_4-s_1041855873.png" target="_blank"></a>

<a href="https://s2.51cto.com/wyfs02/M00/9D/5E/wKioL1l-8WvQPBquAAAKBo7MJwU098.png" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M01/9D/5E/wKioL1l-8aODrdmrAAAKqRtbWQs761.png" target="_blank"></a>

3)比對aeioU範圍内任意單個字元

<code># grep '[aeioU]' a.txt</code>

<code># grep -i '[aeioU]' a.txt</code>

<a href="https://s4.51cto.com/wyfs02/M02/9D/5E/wKioL1l-8gXDvyKhAAAQRMSPHLs103.png" target="_blank"></a>

<a href="https://s5.51cto.com/wyfs02/M02/9D/5E/wKiom1l-8jvzD7TxAAAQN9a122g827.png" target="_blank"></a>

[^] 比對範圍之外的任意單個字元

<code># grep '[^a-z]' a.txt</code>

<code># grep '[^a-zE]' a.txt</code>

<a href="https://s5.51cto.com/wyfs02/M02/9D/5E/wKiom1l-8s3iRhHxAAAPmyotYbk019.png" target="_blank"></a>

<a href="https://s5.51cto.com/wyfs02/M01/9D/5E/wKioL1l-8s3jmq90AAAPrxr9b0g745.png" target="_blank"></a>

比對任意3個字元後跟t

<code># grep '...t' a.txt</code>

<a href="https://s2.51cto.com/wyfs02/M02/9D/5D/wKioL1l-70aRF-3nAAAHwwDmFjo474.png" target="_blank"></a>

比對任意3個字母後跟t

<code># grep '[[:alpha:]][[:alpha:]][[:alpha:]]t' a.txt</code>

<code># grep '[a-zA-Z]' a.txt</code>

<a href="https://s2.51cto.com/wyfs02/M01/9D/5D/wKioL1l-762TcgBIAAARS5CJChg193.png" target="_blank"></a>

比對次數 '前面的單個字元出現的次數'

    1)* 比對前面單個字元出現0、1或多次

    2)\? 比對前面單個字元出現0次或1次

    3)\+ 比對前面的字元'至少1次',&gt;=1次

    4) \{m\} 精确比對前面單個字元m次

    5)\{m,n\} 比對前面單個字元至少m次,至多n次

<code>[root@izpo45bh60h6bsz ~]</code><code># vim output_delimiter.txt</code>

<code>ab</code>

<code>cb</code>

<code>a12b</code>

<code>aab</code>

<code>abb</code>

<code>abababababababab</code>

 1)* 比對前面單個字元出現0、1或多次

<code># grep 'a*b' output_delimiter.txt  #你說:“cb能比對到嗎?”</code>

 2)\? 比對前面單個字元出現0次或1次

<code># grep 'a\?b' output_delimiter.txt</code>

<a href="https://s1.51cto.com/wyfs02/M00/9D/60/wKiom1l_CbDQh-DxAAAM3MVbr7M551.png" target="_blank"></a>

3) \+比對前面單個字元'至少1次'

<code># grep 'a\+b' output_delimiter.txt</code>

<a href="https://s3.51cto.com/wyfs02/M02/9D/60/wKiom1l_C02gnEuMAAAKSmPIFpc605.png" target="_blank"></a>

4)\{m\} 精确比對前面單個字元m次

<code># grep 'a\{2\}b' output_delimiter.txt</code>

<a href="https://s4.51cto.com/wyfs02/M00/9D/60/wKioL1l_C9_Ad7wLAAAIcjfLe3c565.png" target="_blank"></a>

5)\{m,n\} 比對前面單個字元至少m次,至多n次;

<code># grep 'a\{1,2\}b' output_delimiter.txt</code>

<a href="https://s1.51cto.com/wyfs02/M01/9D/60/wKioL1l_DDihC70jAAALGKY_uQE146.png" target="_blank"></a>

5.1)m=0時,比對前面的單個字元至多n次

<code># echo -e 'aaaaaaaaaaaab\naaab\naaab' &gt;&gt; output_delimiter.txt</code>

<code># grep 'a\{0,3\}b' output_delimiter.txt</code>

<a href="https://s5.51cto.com/wyfs02/M01/9D/60/wKiom1l_DxTRuc9sAAAP6aX_0Tk231.png" target="_blank"></a>

5.2)n=時,比對前面的單個字元至少m次

<code># grep 'a\{1,\}b' output_delimiter.txt</code>

<a href="https://s1.51cto.com/wyfs02/M02/9D/60/wKiom1l_D0qDmteOAAANMtfcLu4109.png" target="_blank"></a>

位置錨定 ‘期望比對的字元必須出現在某個位置’

    1)^ 行首錨定,用于模式最左側。由正規表達式所比對到的字串符必須出現在行首

    2)$ 行尾錨定,用于模式最右側。由正規表達式所比對到的字串符必須出現在行尾

    3)^pattern$: 整行隻能比對此模式

    4)比對空白行: ^[[:space:]]*$ 空白可有任意次數

    5)\&lt; 或 \b 詞首錨定,用于單詞模式的左側

    6)\&gt; 或 \b 詞尾錨定,用于單詞模式的右側

    7) \&lt;PATTERN\&gt; 或 \bPATTERN\b 比對整個單詞,用于單詞左右兩側

    8)分組

<code># useradd rooter</code>

<code># useradd rootor</code>

1)^ 行首錨定,用于模式最左側。由正規表達式所比對到的字串符必須出現在行首

<code># grep '^root' /etc/passwd</code>

<a href="https://s2.51cto.com/wyfs02/M02/9D/60/wKiom1l_EPaAJQX1AAAQlP6bqJI964.png" target="_blank"></a>

 2)$ 行尾錨定,用于模式最右側。由正規表達式所比對到的字串符必須出現在行尾

<code># grep 'bash$' /etc/passwd</code>

<a href="https://s4.51cto.com/wyfs02/M02/9D/60/wKiom1l_EfPibgWyAABNmsYH5aE243.png" target="_blank"></a>

3)^pattern$: 整行隻能比對此模式

<code># vim c.txt</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># cat -n c.txt</code>

<code>     </code><code>1</code>

<code>     </code><code>2</code>

<code>     </code><code>3</code>

<code>     </code><code>4   </code>

<code>     </code><code>5</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># grep -n '^$' c.txt </code>

<code>1:</code>

<code>2:</code>

<code>3:</code>

4)比對空白行: ^[[:space:]]*$ 空白可有任意次數

<code>[root@izpo45bh60h6bsz ~]</code><code># grep -n '^[[:space:]]*' c.txt</code>

<code>4:  </code>

<code>5:  </code>

<code>[root@izpo45bh60h6bsz ~]</code><code># grep -c '^[[:space:]]*' c.txt</code>

<code>5</code>

5)\&lt; 或 \b 詞首錨定,用于單詞模式的左側

<code># grep '\broot' /etc/passwd</code>

<a href="https://s4.51cto.com/wyfs02/M01/9D/60/wKiom1l_FfKAeUl4AAAk2C_yLb4838.png" target="_blank"></a>

6)\&gt; 或 \b 詞尾錨定,用于單詞模式的右側

<code># grep 'root\b' /etc/passwd</code>

<a href="https://s3.51cto.com/wyfs02/M02/9D/60/wKioL1l_GVaDwC6fAAAooemrjOE694.png" target="_blank"></a>

7) \&lt;PATTERN\&gt; 或 \bPATTERN\b 比對整個單詞,用于單詞左右兩側

<code># grep '\broot\b' /etc/passwd</code>

<a href="https://s1.51cto.com/wyfs02/M02/9D/61/wKiom1l_GxmxhrNEAAAeP4R5u0o093.png" target="_blank"></a>

8)分組: \(\) 将任意個字元目前同一個元件

<code># cat grep.txt </code>

<code>abxy</code>

<code>xxxxxxy</code>

<code>xyxyxyxyabcxy</code>

<code># grep '\(xy\)\+' grep.txt</code>

<a href="https://s1.51cto.com/wyfs02/M01/9D/61/wKioL1l_HU3BL3DNAAAJvgkac4g955.png" target="_blank"></a>

9)後向引用:分組括号中的模式比對到的内容會被正規表達式引擎記錄于内部的變量中,這些變量的命名方式為:\1,\2,\3

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

    \(ab+\(xy\)*\)

   \1: ab+\(xy\)* 模式所比對到的内容

    \2: xy 模式所比對到的内容

<code># grep '^\([[:alnum:]]\+\&gt;\).*\1$' /etc/passwd</code>

本文轉自 lccnx 51CTO部落格,原文連結:http://blog.51cto.com/sonlich/1952467,如需轉載請自行聯系原作者

上一篇: 日志管理1

繼續閱讀