天天看點

awk && sed (1)====積累取ip以及sed 查找替換

(一)awk 和 sed 的相似點

(1)它們都使用相似的文法來調用。

(2)它們都是面向字元流的,都是從文本中一行一行的輸入,并且将輸入直接送到标準輸出端

(3)它們都使用正規表達式進行模式比對

(4)它們允許使用者在腳本中指定指令

我可能寫的不是很好,這是我寫腳本經常用到的,我認為這種東西要想學好就的多想,然後慢慢積累,而且我個人的心得是更加注重從執行個體出發,有些東西你看到以後多想想,可能到後來你還會遇到一些很相似的東西,不知不覺就學會了。

(一)取ip,一定要注意觀察我報錯的地方

(1)最簡單的方法

[root@localhost ding]# hostname -I   #建議man hostname

192.168.43.1             #如果有倆網卡就顯示兩個ip

一般思路:把這行取出,把ip切出

[root@localhost ding]# ifconfig eth0 | grep 't a' | awk -F '[: ]+' '{print $4}'

192.168.43.1  

 舉例1

[root@localhost ding]# echo 1 2 3    4 | awk '{print $4}'

4

[root@localhost ding]# 

 舉例2 

[root@localhost ding]# echo "1 2 3    4" | awk '/4/' #加上雙引号當作一個整體的字元串

1 2 3    4

[root@localhost ding]# echo 1 2 3    4    #不加當作單個字元串

1 2 3 4

 舉例3

[root@localhost ding]# echo "{a..z}"  #把{a-z}當作了一個整體

{a..z}

[root@localhost ding]# echo {a..z} | awk '{print $4}'   #列印a-z中每一個

d

[root@localhost ding]# echo {a..z} | awk '{print $14}'

n

知識點:

(1)awk 有一個選項叫-F 用來指定分割符(=刀),可以指定一個或多個分割符,為了保證不出錯建議必須用單引号引起來。

(2)當指定多個分割符時必須用'[ ]'裡面來寫要指定的分割符,而'+'表示比對中括号裡面的

任意一個一次或多次

(3)如果不指定預設以空白(不是空格)作為分割符,如舉例1

(4)後面的但引号裡面可以加'pattion {action}',一定要注意觀察特點action是必須要寫在{  }裡面的,而pattion 必須寫在‘{  }’的外面,可以隻寫pattion 不寫action,那麼就預設列印$0,列印一行。也可以隻寫action不寫pattion,例如舉例2,可以列印指定的列

(5) $0 列印一行  $1列印第一列 $2列印第二列

####  grep 't (空格)a' 表示過濾符合條件的特定某行,在ifconfig eth0 中隻有一行是符合這個條件的,我這麼寫是有道理的,不能寫成'a (空格)t ' 或 '[t (空格)a]',表達的意義完全不同

取出特定的某行,用grep是根據這行獨特的特點取的,也可以用sed 或 awk

例如:

[root@localhost ding]# ifconfig eth0 | awk 'NR==2{print $0}'

          inet addr:192.168.43.1  Bcast:192.168.43.255  Mask:255.255.255.0

[root@localhost ding]# ifconfig eth0 | sed -n '2p'

[root@localhost ding]# ifconfig eth0 |head -2 |tail -1

舉例1

[root@localhost ding]# cat 222

Ding Xue

Dingxue

[root@localhost ding]# cat 222 | awk '{print NR}'

1

2

3

[root@localhost ding]# cat 222 | awk '{print NF}'

AWK中的NR NF FNR

pattion  action 是什麼意思呢?就是符合前面的條件,我要做一個後面的事。

這個地方怎麼用語言來表達呢?

AWK 是一行一行讀取,NR就是說我讀取到了第幾行,我就把讀取到這行的行号給輸出出來

NF 就是說我讀取了一行,這一行有多少列,統計下輸出出來

FNR 和 NR 相似用于兩個檔案才能看出差別。

取出一行的方法很多,有時候可能認為有一種方法取出來不就可以了嗎?學習不在多還在精,一定要在一種問題上多思考思考。

[root@localhost ding]# ifconfig eth0 |head -2 |tail -1 |cut -d":" -f2 |cut -d" " -f1

192.168.43.1

舉例1:

[root@localhost ding]# ifconfig eth0 | grep 't a' |cut -d"[: ]+" -f4

cut: 分界符必須是單個字元

請嘗試執行"cut --help"來擷取更多資訊。

[root@localhost ding]# ifconfig eth0 | grep 't a' |cut -d":" -f4

255.255.255.0

[root@localhost ding]# echo 12345 |cut -c2

[root@localhost ding]# echo 12345 |cut -c2-5

2345

[root@localhost ding]# echo 12345 |cut -c-3

123

[root@localhost ding]# echo 12345 |cut -c3

[root@localhost ding]# cat 333

123455555

1231

12355

1242

[root@localhost ding]# cat 333|cut -c1-3

124

[root@localhost ding]# cat 333|cut -c3

知識點

cut :cut 其實挺常用,如果你不會文本處理三劍客,cut 就相當厲害了,我平時用最多的就是 -d

-f -c(最多,腳本用的比較多,也可能是我寫的腳本比較怪,呵呵)

(1)cut 隻能支援一個分割符,不支援正則,是以他不如三劍客強大

(2)-d 用來指定分割符,-f數字 用來說明你要取以分割符為機關的哪一列

(3)-c 是相對于連續不間斷的字元串來說的,例如舉例2

(4)這隻是隻有一行,如果有多行呢? 例如舉例3

如果用sed取就是利用查找替換

[root@localhost ding]# ifconfig eth0 |head -2 |tail -1 |sed -n  's/^.*:\(.*\) Bc.*$/\1/p'

192.168.43.1 

[root@localhost ding]# ifconfig eth0 |sed -n '2p' |sed -n  's/^.*:\(.*\) Bc.*$/\1/p'

[root@localhost ding]# ifconfig eth0 |sed -n  '2s/^.*:\(.*\) Bc.*$/\1/p'

[root@localhost ding]# cat 222 |sed -n '2p'      #觀察

[root@localhost ding]# cat 222 |sed  '2p'        #再觀察

(1)sed -n可以看下面的注釋,舉個例子 。通過上面的例子有沒有領悟到什麼,就是說用sed處理文本的時候‘數字p’列印原來文本加比對文本都列印出來,-n (not),否定原來文本,是以就隻把比對的列印出來的,也可以記住這個固定格式。

(2)後面的一大串都是正則的東西應該系統性總結一下,先不寫了在這裡,内容太多。

例如:替換大小寫,哈哈,試錯是成長的階梯,除了紅色那個其他都是我打錯的,不要注重我打對的結果,更要注重我打錯的結果

[root@localhost 桌面]# echo ding xue |sed -r 's/([^ ]+)/&u/g'

dingu xueu

[root@localhost 桌面]# echo ding xue |sed -r 's/([^ ]+)/\&u/g'

&u &u

[root@localhost 桌面]# echo ding xue |sed -r 's/([^ ]+)/\u&/g'

[root@localhost 桌面]# echo ding xue |sed -r 's/([^ ]+)/\u&/p'

Ding xue

[root@localhost 桌面]# echo ding xue |sed -nr 's/([^ ]+)/\u&/p'

Ding xue 

[root@localhost 桌面]# echo ding xue da mei nv |sed -nr 's/([^ ]+)/\u&/p'

Ding xue da mei nv

[root@localhost 桌面]# echo ding xue da mei nv |sed -nr 's/([^ ]+)/\u&/g'

[root@localhost 桌面]# echo ding xue da mei nv |sed -r 's/([^ ]+)/\u&/g'

Ding Xue Da Mei Nv

下面是我百度的一些常用選項:

sed是一個很好的檔案處理工具,本身是一個管道指令,主要是以行為機關進行處理,可以将資料行進行替換、删除、新增、選取等特定工作,下面先了解一下sed的用法

sed指令行格式為:

         sed [-nefri] ‘command’ 輸入文本        

常用選項:

        -n∶使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN的資料一般都會被列出到螢幕上。但如果加上 -n 參數後,則隻有經過sed 特殊處理的那一行(或者動作)才會被列出來。

        -e∶直接在指令列模式上進行 sed 的動作編輯;

        -f∶直接将 sed 的動作寫在一個檔案内, -f filename 則可以執行 filename 内的sed 動作;

        -r∶sed 的動作支援的是延伸型正規表示法的文法。(預設是基礎正規表示法文法)

        -i∶直接修改讀取的檔案内容,而不是由螢幕輸出。       

常用指令:

        a   ∶新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~

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

        d   ∶删除,因為是删除啊,是以 d 後面通常不接任何咚咚;

         i   ∶插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);

         p  ∶列印,亦即将某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~

         s  ∶取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!

本文轉自 大雪兒 51CTO部落格,原文連結:http://blog.51cto.com/dingxue/1969107,如需轉載請自行聯系原作者