天天看點

Linux文本處理“三劍客”之grep

    在linux中,因為一切皆檔案,而大部分程式的配置檔案是文本形式的。是以對文本的處理就顯得相當的重要了。對文本的處理包括對文本内容的搜尋,文本内容的處理。下面就介紹文本的搜尋相關知識。

文本内容搜尋

    文本搜尋的含義是:根據使用者指定的文本搜尋模式(搜尋條件)對目标檔案進行逐行的掃掃描,将比對到的行列印在螢幕上。文本搜尋的主要作用是用于統計相關資訊。

一、正規表達式 

1、正規表達式的概念

    是一類字元的書寫模式,這些個字元不代表本字元的意義,而是具有特殊意義。一般是對控制或通配的功能。

2、正規表達式的識别

    靠正規表達式引擎來負責翻譯或者解釋其中元字元的含義,正規表達式引擎是一段程式。通常每種語言(包括shell)的正規表達式引擎都不一樣,進而導緻了每種語言的正規表達式的元字元所代表的意義都不盡相同。

3、正規表達式的元字元

    正規表達式元字元:就是代表特殊意義的特殊字元。

1)字元集種類及表示方法

種類

意義

0-9 或 [:digit:]

0-9數字

a-z 或 [:lower:]

小寫字母

A-Z 或 [:upper:]

大寫字母

[:space:]

空格或TAB空白字元

[:punct:]

特殊字元

[:alpha:]

大小寫字母

[:alnum:]

字母和數字的組合

2)基本正規表達式的元字元:

元字元種類

具體含義

示例

字元比對

.

表示比對任意單個字元

l..k  比對像:love,like

[]

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

[0-9] 0-9任意一個數字

[[:upper:]] 比對大寫字母中的任意一個

[^]

比對指定範圍外的任意單個字元

[^a-z] 比對除a-z以外的任意字元

[^[:alnum:]] 比對除數字和字母以外的任意字元

次數比對

*

比對前面字元任意次,包括0次

ca*  比對像:c,ca,caa,caaa等

\?

比對前面字元至多一次,就是說前面的字元可有可無

ha\?  比對的隻有:he,h

\{m\}

精确比對前面的字元m次

hm\{2}\  比對的隻有:hmm

\{m,\}

比對前面的字元至少m次

hm\{2,}\  比對像:hmm,hmmm等

\{m,n\}

比對前面字元至少m次,至多n次

hm\{2,4\} 比對:hmm,hmmm,hmmmm

\{0,m\}

比對前面的字元至多n次

hm\{0,3\} 比對:hm,hmm,hmmm

位置錨定

^

錨定行首,寫在最左側

^abc  

$

錨定行尾,寫在最右側

abc$

\<  \b

錨定單詞詞首,出現與單詞最左側 

\<abc \babc

\>   \b

錨定單詞詞尾,出現單詞的最右側

abc\> abc\b

分組

\(\)

分組中的模式比對到的内容,可由正規表達式引擎儲存在記憶體中,之後可被引用

\(abc\)

\#

引用定#個括号所配到的内容,而非模式本身。#确定方法自左向右左括号的個數

\1,\2

    注意:在這裡單詞的意思是,不包含特殊字元的連續字元組成的字元串就叫做單詞。

3)擴充正規表達式的元字元:

. [] [^]

同基本正規表達式完全一樣

* ? {m}{m,}

{m,n} {0,m}

同基本正規表達式一樣,但注意一點是:?和{}在使用的時候不用轉義了

+

比對前面的字元至少1次

hm+ 比對:hm,hmm,hmmm等

^ $ \<  \b  \>

()

同基本正規表達式一樣,但注意一點是()在使用的時候不用轉義了

或者

|

表示選擇關系

c|Cat 比對的是:c 或者 Cat

|整個左邊是一部分,|整個右邊是一部分

二、文本内容搜尋指令

    常用的文本搜尋指令有grep,egrep,fgrep

1、grep:Golbal search REgular and Print out the line.

    文本搜尋的含義是:根據使用者指定的文本搜尋模式(搜尋條件)對目标檔案進行逐行的掃掃描,将比對到的行列印在螢幕上。

    Usage: grep [option]... 'PATTERN' FILE...

    對于PATTERN的條件的設定或者說書寫,可以借助于正規表達式。

常用參數

參數意義

-i

比對時PATTERN中的條件,忽略器大小寫

grep -i 'Root' /etc/passwd

-v

反向比對,顯示沒有比對到的行

grep -v 'linux' /etc/passwd

-o

隻顯示比對到的内容

grep -o 'gentoo' /etc/passwd

--color=auto

支援擴充表達式

grep --color=auto 'root' /etc/passwd

-A

顯示比對行的後面指定數目行

grep -A 2 'linux' /etc/passwd

-B

顯示比對行的前面指定數目行

grep -B 3 'linux' /etc/passwd

-C

顯示比對行的前後指定相同數目行

grep -C 2 'linux' /etc/passwd

-n

顯示輸出行的行号

grep -nC 2 'linux' /etc/passwd

-E

支援擴充正規表達式

grep -E '[0-9]+' /etc/passwd

-c

隻顯示比對到行的數目

grep -c '^root\>' /etc/passwd

2)egrep相等于grep -E。

3)fgrep:fast grep,這裡不支援正規表達式,常用選項和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

<code>#1、顯示/proc/cpuinfo檔案中以大寫或小寫C開頭的行,并顯示出對應的行号;</code>

<code>#實作指令:</code>

<code>#grep -n '^[Cc]' /proc/cpuinfo </code>

<code>#grep -nE '^c|C' /proc/cpuinfo </code>

<code>#grep -i '^c' /proc/cpuinfo</code>

<code>#示範結果 </code>

<code>[root@server ~]</code><code># grep -n '^[Cc]' /proc/cpuinfo | head -n 3</code>

<code>3:cpu family   : 6</code>

<code>7:cpu MHz      : 2394.620</code>

<code>8:cache size   : 3072 KB</code>

<code>#2、顯示/etc/passwd檔案中其預設shell為非/sbin/nologin的,并且UID最小的使用者</code>

<code>[root@server ~]</code><code># grep '/sbin/nologin$' /etc/passwd | sort -n -t: -k3 | head -n 1 | cut -d: -f1</code>

<code>bin</code>

<code>#3、找出/etc/passwd檔案中的一位數或兩位數或三位數;</code>

<code>[root@server ~]</code><code>#grep "\&lt;[0-9]\{1,3\}\&gt;" /etc/passwd</code>

<code>shutdown</code><code>:x:6:0:</code><code>shutdown</code><code>:</code><code>/sbin</code><code>:</code><code>/sbin/shutdown</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>uucp:x:10:14:uucp:</code><code>/var/spool/uucp</code><code>:</code><code>/sbin/nologin</code>

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

<code>games:x:12:100:games:</code><code>/usr/games</code><code>:</code><code>/sbin/nologin</code>

<code>#4、-c:隻顯示比對到行的數目</code>

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

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

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

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

<code>2</code>

<code>#5、找出ifconfig指令結果中的1-255之間的數字</code>

<code># ifconfig | grep -o -E "\&lt;([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\&gt;"</code>

<a href="http://s3.51cto.com/wyfs02/M02/39/5A/wKioL1O5VIzh3c07AAHz7Enw6N4250.jpg" target="_blank"></a>

本文轉自 羊木狼 51CTO部落格,原文連結:http://blog.51cto.com/guoting/1435072,如需轉載請自行聯系原作者

繼續閱讀