(一)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,如需轉載請自行聯系原作者