Linux Shell之十 sed與awk

    設計script時,有時候須要修改腳本,例如刪除或置換某些關鍵詞。像這種在script執行過程動態修改文件的作法,稱爲流編輯。具備流編輯能力的工具,稱爲流編輯器。sed是這方面的強者。另外script執行時可能要製做報表,呈現各字段信息,awk完美解決。正則表達式

1、正則表達式express

    正則表達式是組成「樣式」的基本語法,而「樣式」是運用sed和awk必備的能力。sed和awk相同的運行方式是:只要符合「樣式」的數據行,就對它執行指定的「操做」。centos

什麼是正則表達式?bash

正則表達式是一種描述的方法,一種小型的語言,可表示某種樣式或若干種樣式的組合,它的威力在於僅需幾個簡單的字符,即可表明許多字符串共同的樣子。網絡

一、. 表明任意字符編輯器

   .a. 表明中間爲a,兩邊隨意字符的3個字符。(若要對比.自己須要用\轉義)ide

二、^ 表明在行首工具

   ^abc  abd應該出如今行首。"abc,hello"和"hello abc" 前者符合後者不符合spa

三、$ 表明在尾部設計

   $abc  abd應該出如今行尾。"abc,hello"和"hello abc" 後者符合前者不符合

四、[...] 字符集合

   [...] 表明字符 串行中的一個字符 [aBc]表明a或B或c。[A-Z]一個大寫[^A-Z]除了大寫以外的一個字符。

五、*出現0個以上

   a*c能夠是abc、abbc、abbbc、aSJKSKBKc.....

六、\{...\}指定符合的個數

   \{3,5\}前邊的字符有3~5個。[a-z]\{3,5\}表明以小寫字母組成的字符串,長度爲3~5個

七、\(..\)把對比符合的字符串暫時保存起來

   a\(..\)b要保存a、b之間的2個字符,若要提取保存的字符串,可用位置參數,\1表明第一個保存的字符串,\2表明第二個保持的字符串。


2、擴展正則表達式

RE字符  意義與範例

+       重複1個或1個以上的前一個RE字符

        egrep 'go+d' file 搜尋範圍是 god good goood gooood......等

?0個或1個的前一個RE字符

        egrep 'go?d' file 搜尋範圍 god good

|       用或(or)的方式找出字符串

        egrep 'g(la|oo)d file 搜尋範圍 glad good

()+     多個重複羣組的判別

        echo "AxyzxyzxyzxyzC" |egrep 'A(xyz)C' 意思是A開頭,C結尾,中間有一個以上的"xyz"字符串的意思 

注意:  !在正規表達式中不是特殊字符,若是要查包含!與<的字行時, grep '[!>]' file

        [!a-z] 這樣反響選擇是錯誤的,[^a-z] 這樣纔是正確的。

格式化打印:printf 


3、sed的用法

sed是一種非交互式的流編輯器,可動態編輯文件。sed處理的對象是文件的數據流。sed的工做模式是對比每一數據行,若符合樣式,就執行特定的操做。

sed的語法:sed'樣式命令'文件

意思是若是文件某一行符合'樣式',就執行指定是的sed命令,如刪除(d)或取代(s)或顯示(p)。

這裏的'樣式'使用一對//含括,表示尋找之意。/1,6/第一行到第6行,/a/,/b/含有a到b的行

注意:sed並不會更改原文件內容。sed的工做方式是讀取文件內容,經流編輯後,把結果顯示到標準輸出,如想要存儲sed處理結果,要自行運用轉向輸出講結果存成其它文件。

sed的選項:

sed -n 使用安靜模式,在通常sed模式中,全部來自STDIN的數據通常都會被列出到屏幕上,加上-n後只有通過sed處理的那才一行纔會被列出來。

    -e 直接在指令模式上進行sed的動做編輯

    -f 直接將sed動做寫在一個檔案內,-f filename 則能夠執行filename內的sed動做。

    -r sed的動做支持延申動做表示法

    -i 直接修改檔案讀取的內容.(直接修改原文本內容,當心操做)

動做說明: [n1[,n2]]function 

n1,n2不見得會存在,通常表明 選擇進行的動做的行數,舉例來講,若是個人動做是須要在10到20行之間進行的,則10,20[動做行爲] 

function 有底下這些東西:

    a:新增, a的後面能夠接字符串,而這些字符串會在新的一行出現(目前的下一行)

    i :插入, i後面能夠接字符串,而這些字符串會在新的一行出現(目前的上一行);

    c :取代, c的後面能夠接字符串,這些字符串能夠取代 n1,n2 之間的行!

    d :刪除,由於是刪除啊,因此 d 後面一般不接任何咚咚;

    p :打印,亦即將某個選擇的數據印出。一般 p 會與參數 sed -n 一塊兒運做~

    s :取代,能夠直接直接進行取代的工做!一般這個 s 的動做能夠搭配 正則表示法!例如 1,20s/old/new/g 就是!

sed的語法:

sed 's/要取代的字符/新字符/g'                g表示全局的意思

一、刪除某一段範圍的數據行

  sed '1,4d' file 把第1到第4行數據刪除,剩下的顯示出來。($表明最後一行'1,$')

二、把含有樣式的數據行刪除

  sed '/ab/d' file 把含有ab的全部行刪除。 sed '/[0-9]\{3\}/d' file 把含有3爲數的行刪除。\{3\}表示//要尋找的3個數字的字符串 sed '/^$/d' file 刪除空白行

三、把不含樣式的行刪除

  sed '/ab/!d' 不含ab的行刪除,剩下的顯示出來。(或者說把涵ab的行不刪除

四、把含有樣式的數據行顯示出來(但sed默認也顯示不符合的數據行)

 sed '/ab/p' 把含有ab的行顯示出來,不符合的也顯示出來   -n會抑制默認顯示其它行 sed -n '/ab/p' 只把含ab的行顯示出來。

五、取代

 sed -n 's/ab/AB/p' file 把file中每一行第一個出現ab的字符串換位AB,sed -n 's/ab/AB/gp' file 把file中每行全部的ab都換爲AB

 sed -n 's/ab//p' file 把file中每行第一個ab刪除(把ab置換成空字符串就是刪除)

 sed 's/^...//' file 把每一行開頭的3個字符刪除,若是^是$,則把每行最後3個字符刪除。

六、取用符合樣式的字符串

 sed -n 's/\(ab\)/\1cd/p' file 把每行第一個出現ab的字符換爲abcd 。可分解爲sed -n 's/ \(ab\) / \1cd /p 其中( ) 1以前都用\來轉義,依舊是//模式

七、找到符合樣式的數據後,再進行取代操做

 sed -n '/AAA/s/ab/AB/p' file 找到含有AAA的行後,把第一個出現的ab換成AB(若是是gp,就把每行出現的ab換成AB)

 sed -n '/aaa/,/bbb/s/123/456/gp'  file將含有aaa到bbb的那幾行,把全部的123換成456

 sed -n '2,4s/a/b/p' file  由第2行到第4行,把出現的第1個a換成b

例子:

cat /etc/passwd| sed '2a hello world'

在第2行的後邊加一行內容是helloworld,若是a前沒有數字.就在每行後邊另起一行,內容爲hello world (若是前邊的話用i)

cat /etc/passwd| sed '2i one \ two ' 

在第2行前邊增長2行,內容分別爲one、two ,每行之間要用 \(回車) 隔開

cat /etc/passwd | sed '2i 1 \

2 \

3 \

4 \

5'

在第2行前邊增長5行,內容分別是1 2 3 4 5

cat /etc/passwd | sed  '1c hello world'  把第1行內容換爲hello world

cat /etc/passwd | sed  '2,4c hello world'  把第2-4行內容換爲hello world

cat /etc/passwd | sed -n '1p'  顯示第1行 若是是 sed -n '2,3p' 爲顯示第2行和第3行。 sed '$p'顯示最後一行 

grep -v '^$' file | grep -v '^#' 和 egrep -v '^$|^#' regular_express.txt  $表明最後一行去除空白行與行首爲 # 的行列 

cat /etc/passwd |sed -e '1d' -e '2,3c hello world'  把第1行刪除,把第2行和第3行內容換成hello world

注意:

若是sed後跟多個選項,務必使用-e參數


4、awk的用法

awk是一種能夠處理數據、產生格式化報表的語言。它的工做方式是讀取數據,將每一行數據視爲一條記錄,每筆記錄以字段分隔符分紅若干字段,而後輸出各個字段的值。

awk對每一條記錄,都會套用一個"樣式{操做}",若是該行符合樣式,就執行指定的操做。

樣式或操做之一能夠省略。若是隻有樣式,表示要顯示符合樣式的行;若是隻有操做,表示對每一行數據都執行該項操做。

awk的經常使用的做用格式:

awk "樣式"   文件:把符合樣式的數據行顯示出來。

awk ‘{操做}’ 文件:對每一行都執行{}中的操做。

awk ‘樣式{操做}’對符合樣式的數據行,執行{}中的操做。

awk的幾種用法:

一、awk '/root/' file 

   顯示file中root的行

二、awk '{print $1,$2}' file         ","能夠省略若是讓兩個字符以空格隔開的話用 awk '{print $1 "\t" $2'

   顯示file中每一行的第1個和第2個字段(默認以空格爲分隔符)

三、awk '/ab/{print $1,$2}' file

   顯示file中有ab的行的第1個和第2個字段(以空格爲分隔符)

四、awk -F: '/^root/{print $2,$3}' file

   以":"爲分隔符,把以root開頭的行中的第2個和第3個字符顯示出來。

五、awk -F: 'BEGIN{OFS="++++"}/^root/{print $1,$2,$3}' /etc/passwd 

   把passwd中,以":"爲分隔符找出首行爲root的行,並顯示前3個字段,而且字段之間以+++隔開

實例:

變量名稱表明意義

NF每一行$0擁有的字段總數(默認以空格或Tab爲分隔符)

NR目前awk所處理的是第幾行數據

FS目前的分隔符,默認是空格鍵

[root@centos ~]# cat 1
a2a3a4a5a
b2b3b4b5b
c2c3c4c5c
[root@centos ~]# cat 1|awk '{print $1 "\t 行:" NR "\t 該行總字段:" NF}'
a 行:1 該行總字段:5
b 行:2 該行總字段:5
c 行:3 該行總字段:5
查閱passwd第三欄數據小於10的數據的行,而且僅列出帳號和第三欄。
cat /etc/passwd|awk '{FS=":"}$3<10 {print $1 "\t" $3}'  
root:x:0:0:root:/root:/bin/bash
bin1
daemon2
...
mail8

上邊第一行會所有顯示出來,這是由於咱們讀入第一行的時候,那些變數 $1, $2..默認仍是以空格鍵爲分隔的,因此雖然咱們定義了 FS=":" 了, 可是卻僅能在第二行後纔開始生效。

那麼怎麼辦呢?咱們能夠預先設定 awk 的變量啊! 利用 BEGIN 這個關鍵詞!這樣作:cat /etc/passwd|awk 'BEGIN{FS=":"}$3<10 {print $1 "\t" $3}'

顯示ip地址

ifconfig |grep 'inet addr'|grep Bcast|awk '{print $2}'|awk -F: '{print $2}' 

顯示網絡名稱

cat /proc/net/dev |awk -F: '/eth.:|sit.:|wlan.:|ppp.:/{print $1}'


sed與awk能夠單獨寫出一本書,實在很強大,本篇只介紹最簡單的用法。

這些都是讀書筆記,接下來咱們真正進入Shell實戰!

相關文章
相關標籤/搜索