天天看點

shell正規表達式

   Shell腳本擴充

一 正确表達式

正規表達式作為一個模闆,将某個字元模式與所搜尋的字元串進行比對。

1. 支援的指令:

grep、vim、find、awk、sed等。

1、.代表任意單個字元, 如:/l..e/與包含一個l,後跟兩個字元,然後跟一個e的行相比對 

<a href="https://s4.51cto.com/wyfs02/M02/9A/C2/wKioL1laJH2wY7NPAAATyWzK6Bo699.png-wh_500x0-wm_3-wmp_4-s_3151929990.png" target="_blank"></a>

檢索wang.txt檔案中比對s字元的。

2、^代表行的開始。 ^love 如:與所有love開頭的行比對 

<a href="https://s2.51cto.com/wyfs02/M00/9A/C2/wKiom1laJJDRp6HNAAASO3nQ-PE632.png-wh_500x0-wm_3-wmp_4-s_1452893940.png" target="_blank"></a>

檢索wang.txt檔案中以N開頭的。

3、$代表行的結束。love$ 如:與所有love結尾的行比對 

那麼‘^$’ 就表示空行

<a href="https://s5.51cto.com/wyfs02/M00/9A/C2/wKioL1laJKSiXN-nAAAWmrWLm04269.png-wh_500x0-wm_3-wmp_4-s_4278839935.png" target="_blank"></a>

通配符

<a href="https://s5.51cto.com/wyfs02/M00/9A/C2/wKioL1laJLbw3sZ9AAAiv4PXeDk932.png-wh_500x0-wm_3-wmp_4-s_616313499.png" target="_blank"></a>

檢索wang.txt檔案中比對小寫字母a到z之間的。

注意:

[abc]表示比對單個字元a或b或c

[123]表示比對單個字元1或2或3

[A-Z]表示比對大寫字母A-Z之間一個

[^a]表示取反,比對除去小寫字母a的。

5、* 用于修飾前導字元,表示前導字元出現0次或任意多次

<a href="https://s1.51cto.com/wyfs02/M02/9A/C2/wKiom1laJNKyYttlAAAQfcWeIVc502.png-wh_500x0-wm_3-wmp_4-s_4180235507.png" target="_blank"></a>

檢索wang.txt檔案中出現0次或多次T的

6、\? 用于修飾前導字元,表示前導字元出現0或1次

<a href="https://s5.51cto.com/wyfs02/M02/9A/C2/wKioL1laJOnAFGfAAAAZLV1tIz0307.png-wh_500x0-wm_3-wmp_4-s_1550818454.png" target="_blank"></a>

7、\+ 用于修飾前導字元,表示前導字元出現1或多次

<a href="https://s4.51cto.com/wyfs02/M00/9A/C2/wKiom1laJP6Q6ciBAAANrby7R_8383.png-wh_500x0-wm_3-wmp_4-s_3879782916.png" target="_blank"></a>

8、\{n,m\}  用于修飾前導字元,表示前導字元出現n至m次 (n和m都是整數,且n&lt;m)

 表示前導字元出現n至m次;

 n/m為整數,并且m&gt;n;

 其他形式:

\{n\}連續的n個前導字元;

\{n,\}連續的至少n個前導字元;

<a href="https://s3.51cto.com/wyfs02/M02/9A/C2/wKiom1laJQ_hdvaYAAAQyg7RLHg584.png-wh_500x0-wm_3-wmp_4-s_3273507982.png" target="_blank"></a>

檢索wang.txt檔案中出現2至4個n的

9、\  用于轉義緊跟其後的單個特殊字元,使該特殊字元成為普通字元

檢索wang.txt檔案中含有.的。

10、|表示或  如: a|b|c 比對a或b或c。如:grep|sed比對grep或sed

<a href="https://s3.51cto.com/wyfs02/M01/9A/C2/wKioL1laJV2jN6TlAAAaTyQSB5U348.png-wh_500x0-wm_3-wmp_4-s_3593335666.png" target="_blank"></a>

檢索wang.txt檔案中含有a或b的。

11、(),将部分内容合成一個機關組,比如 要搜尋 glad 或 good 可以如下 'g(la|oo)d'

<a href="https://s1.51cto.com/wyfs02/M00/9A/C2/wKiom1laJXTyi5gGAAASsC4PdOA513.png-wh_500x0-wm_3-wmp_4-s_2024509123.png" target="_blank"></a>

二、grep指令的用法

參數:

1. -A NUM,--after-context=NUM   除了列出符合行之外,并且列出後NUM行。

列出chai.txt檔案中Tom行與後倆行

2. -B NUM,--before-context=NUM  與 -A NUM 相對,但這此參數是顯示除符合行之外并顯示在它之前的NUM行。

列出chai.txt檔案中Tom行與前倆行。

3、 -C [NUM], -NUM, --context[=NUM]  列出符合行之外并列出上下各NUM行,預設值是2。

<a href="https://s1.51cto.com/wyfs02/M00/9A/C2/wKioL1laJfSiuCyvAAAPLJMJvps485.png-wh_500x0-wm_3-wmp_4-s_2330381067.png" target="_blank"></a>

列出chai.txt檔案中Tom行與前後倆行。

4、 -c, --count  不顯示符合樣式行,隻顯示符合的總行數。若再加上-v,--invert-match,參數顯示不符合的總行數

<a href="https://s2.51cto.com/wyfs02/M02/9A/C2/wKiom1laJgWRFgrZAAAiWjmK168264.png-wh_500x0-wm_3-wmp_4-s_4161132210.png" target="_blank"></a>

列出chai.txt檔案中含有Tom的行數;

列出chai.txt檔案中不含有Tom的行數。

5、-i,--ignore-case 忽略大小寫差别

<a href="https://s5.51cto.com/wyfs02/M02/9A/C2/wKiom1laJhfyz3URAAALqu3TCS8603.png-wh_500x0-wm_3-wmp_4-s_877538965.png" target="_blank"></a>

列出chai.txt檔案中含有tom(大小寫)的行。

6、-n,--line-number 在比對的行前面列印行号

<a href="https://s2.51cto.com/wyfs02/M02/9A/C2/wKioL1laJjaDIdDkAAAO_6tqFZs317.png-wh_500x0-wm_3-wmp_4-s_639441877.png" target="_blank"></a>

列出chai.txt檔案中含有tom(大小寫)的行,并且列印出行号。

7、-v,--revert-match  反檢索,隻顯示不比對的行

<a href="https://s2.51cto.com/wyfs02/M00/9A/C2/wKiom1laJkmR9A6wAAAY5IbcIOQ002.png-wh_500x0-wm_3-wmp_4-s_300556371.png" target="_blank"></a>

列出chai.txt檔案中不含有tom的行。

8、精确比對:

例如在抽取字元串“ 48”,傳回結果包含諸如484和483等包含“48”的其他字元串,實際上應精确抽取隻包含48的各行。

<a href="https://s5.51cto.com/wyfs02/M00/9A/C2/wKioL1laJlrgqP_PAAASdaMz83s817.png-wh_500x0-wm_3-wmp_4-s_3021184716.png" target="_blank"></a>

精确列出chai.txt檔案中含有30的行。

9、-s 不顯示不存在或無比對文本的錯誤信

<a href="https://s4.51cto.com/wyfs02/M01/9A/C2/wKiom1laJnXBXhFmAAAT6bWzuB0451.png-wh_500x0-wm_3-wmp_4-s_368935410.png" target="_blank"></a>

xin.txt檔案不存在,檢索時候提示搜尋不到的錯誤資訊,

如果不要錯誤資訊提示,則加上-s。

三、sed指令的用法

1sed是一種線上編輯器,它一次處理一行内容。處理時,把目前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接着用sed指令處理緩沖區中的内容,處理完成後,把緩沖區的内容送往螢幕。

2把緩沖區的内容送往螢幕。接着處理下一行,這樣不斷重複,直到檔案末尾。

3檔案内容并沒有改變,除非你使用重定向存儲輸出。

1.替換: s指令

  1.1 基本用法 

把chai.txt中The替換成chai,輸出到aaa.txt檔案中。

sed 替換指令

/../../分隔符(可以用其他符合代替)

The 搜尋的字元串

chai  替換的字元串

&lt;chai.txt&gt;  搜尋的檔案  

aaa.txt   輸出到的檔案

1.2 用 &amp; 表示比對的字元串

有時可能會想在比對到的字元串周圍或附近加上一些字元 .

 如: sed 's/abc/(abc)/' &lt;old &gt;new

sed 預設隻替換搜尋字元串的第一次出現 , 利用 /g 可以替換搜尋字元串所有

如果需要對同一檔案或行作多次修改,可以使用 "-e" 選項

3.删除行:d指令

從某檔案中删除包含 "how" 的所有行

<a href="https://s5.51cto.com/wyfs02/M00/9A/C3/wKioL1laJ22R8eerAAAc5rXf7Dg404.png-wh_500x0-wm_3-wmp_4-s_1069867269.png" target="_blank"></a>

将passwd内容顯示并列印行号,同時删除2到5行。

4.增加行:a指令(在指定的行後新增)或i指令(在指定的行前新增)

a的後面可以接字元串,而這些字元串會在新的一行出現

在/etc/passwd的第二行後增加“XXXXX”字樣的新行

<a href="https://s2.51cto.com/wyfs02/M01/9A/C2/wKiom1laJ4HjRxIpAAAZTGwdLUk369.png-wh_500x0-wm_3-wmp_4-s_2076472186.png" target="_blank"></a>

将passwd内容顯示并列印行号,同時在第二行後新增hello。

<a href="https://s4.51cto.com/wyfs02/M01/9A/C2/wKiom1laJ5biAIPDAAAa3pREktQ522.png-wh_500x0-wm_3-wmp_4-s_3792230718.png" target="_blank"></a>

将passwd内容顯示并列印行号,同時在第二行前新增hello。

如果要同時新增多行,則每行之間要用反斜杠\來進行新行的添加

<a href="https://s1.51cto.com/wyfs02/M01/9A/C3/wKioL1laJ6fC5uY5AAAWzVFyksU683.png-wh_500x0-wm_3-wmp_4-s_516132486.png" target="_blank"></a>

5、取代行:c指令

c的後面可以接字元串,這些字元串可以取代n1,n2之間的行

取代行

<a href="https://s1.51cto.com/wyfs02/M02/9A/C2/wKiom1laJ8Dz3-gxAAAUuKJlzJ8663.png-wh_500x0-wm_3-wmp_4-s_3504053442.png" target="_blank"></a>

将passwd内容顯示并列印行号,同時取代2到5行間内容。

6、列印:p指令 

sed '/north/p' datafile 預設輸出所有行,找到north的行重複列印 

僅列出passwd檔案中的第5到7行内容。

sed 的-i選項可以直接修改檔案中的内容

<a href="https://s2.51cto.com/wyfs02/M02/9A/C3/wKioL1laJ_3jtmFrAAAtbwKEVks668.png-wh_500x0-wm_3-wmp_4-s_3049273991.png" target="_blank"></a>

6.擴充:

調用sed有三種方式:

l 在指令行鍵入指令

l 将sed指令插入腳本檔案,然後調用sed

l 将sed指令插入腳本檔案,并使sed腳本可執行。

A、 使用sed指令行格式為:

sed [選項] sed指令 輸入檔案。

記住在指令行使用sed指令時,實際指令要加單引号。sed也允許加雙引号。

B、使用sed腳本檔案,格式為:

sed [選項] -f sed腳本檔案  輸入檔案

C、要使用第一行具有sed指令解釋器的sed腳本檔案,其格式為:

sed腳本檔案 [選項]  輸入檔案

<a href="https://s4.51cto.com/wyfs02/M00/9A/C3/wKioL1laKBSzBBTQAAARQpQ7qLQ742.png-wh_500x0-wm_3-wmp_4-s_3787941661.png" target="_blank"></a>

第一行是sed指令解釋行。腳本在這一行查找sed以運作指令,這裡定位在/bin。

第二行以/company/開始,這是附加操作起始位置。a\通知sed

是一個附加操作,首先應插入二個新行。

第三、四行是附加操作要加入到拷貝的實際文本。

<a href="https://s4.51cto.com/wyfs02/M01/9A/C2/wKiom1laKC3Rhry7AAAa3S3ipew382.png-wh_500x0-wm_3-wmp_4-s_1013929790.png" target="_blank"></a>

     本文轉自柴鑫旺 51CTO部落格,原文連結:,http://blog.51cto.com/chaixinwang/1944177如需轉載請自行聯系原作者