目錄
Linux中很多文本工具都使用到了正則表達(dá)式,正則表達(dá)式可以極大的簡化linux系統(tǒng)管理工作,因?yàn)榫W(wǎng)上有很多正則相關(guān)的教程,所以這里不再講述,我當(dāng)時(shí)看的是菜鳥的正則表達(dá)式,看個(gè)一下午在實(shí)驗(yàn)幾遍基本就會(huì)了,除了正向肯定預(yù)查,反向肯定預(yù)查這幾個(gè)比較復(fù)雜一些,其他都是非常簡單的,很多時(shí)候記不住也可以查詢網(wǎng)上對(duì)著寫,并不需要你實(shí)時(shí)記住。這里主要談?wù)刟wk等用到正則表達(dá)式的文本處理工具。
awk的指令必須包含在單引號(hào)中。
awk -F'指定輸入分隔符' 'BEGIN{做一些初始化工作} 一些過濾條件 {針對(duì)每行的工作}... END{最后收尾工作}'
中間的處理塊可以有多個(gè),通過過濾條件單每行都會(huì)走一遍過濾條件,其中BEGIN和END邊只會(huì)執(zhí)行一遍
awk -F: '{print $1,$3,$6}' /etc/passwd
等價(jià)于awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd
awk -F '[;:]'
指定多個(gè)分隔符awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd
指定輸出分隔符需要注意的是上面print $1,$3,$6
中的,
被替換成了分隔符,如果是print $1$3$6
則中間沒有分隔符
awk'/hello/ {print}' test.sh
awk '!/hello/ {print}' test.sh
awk '/hello/ && /world/ {print}' test.sh
awk '/hello/ || /world/ {print}' test.sh
也可以寫成awk '/hello|world/ {print}' test.sh
awk '$5 ~ /hello/ {print}' test.sh
awk '$5 !~ /hello/ {print}' test.sh
$ awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt"; else if($6 ~ /LISTEN/) print > "2.txt"; else print > "3.txt" }' netstat.txt
awk 'NR!=1{print > $6}' netstat.txt
其實(shí)使用了 >
重定向,上例子使用了if語句
awk 'NR!=1{a[$6] ;} END {for (i in a) print i ", " a[i];}' netstat.txt
$ x=5 $ y=10$ export y $ echo $x $y5 10$ awk -v val=$x '{print $1, $2, $3, $4 val, $5 ENVIRON["y"]}' OFS="\t" score.txtMarry 2143 78 89 87Jack 2321 66 83 55Tom 2122 48 82 81Mike 2537 87 102 105Bob 2415 40 62 72
參數(shù)列表:
grep主要就是一個(gè)正則表達(dá)式的使用,其中需要注意正則有三種BREs、EREs和PREs。前兩種不支持非貪婪匹配。grep默認(rèn)是BREs,所以他?, ,|,{,},(,)
這種字符都需要用\
轉(zhuǎn)義,另外他不支持\s,\S,\D,\d,\n
等字符。
sed命令在自動(dòng)化腳本編寫的過程還是經(jīng)常用到的。
基本句式: sed -nfei [操作]
操作: n1,n2 動(dòng)作
動(dòng)作:
例子:
sed -e 's/hello/hi/g'
:替換文本,-e可以省略sed -e '1,2s/hello/hi/g' -e '3,4s/world/man/g
:等價(jià)于sed -e '1,2s/hello/hi/g;3,4s/world/man/g
sed s/hello \(world\)/\1 hi/g'
:群組匹配,可以使用\n選擇前面的群組sort參數(shù)
sort test.txt >test.txt
不可用,因?yàn)?gt; 是想清空文件,所以會(huì)導(dǎo)致文件在排序之前就清空了例子:
sort -t $'\t' -k 1 -u res.txt > res2.txt
以tab作為分隔符,按第一列排序并去重uniq參數(shù)
需要注意uniq需要文本是有序的,所以一般使用uniq的時(shí)候是用更早sort的管道后面
說說sort|uniq
和sort -u
,一直覺得很奇怪,兩者有什么區(qū)別,功能是一樣的。sort -u
是后面加入的,所以很多人還是使用了sort|uniq
,
目前推薦使用sort -u
,因?yàn)檫€少了進(jìn)程間通訊。
http://www.baidu.com/index.html
http: / / www.baidu.com/1.html
http://post.baidu.com/index.html
http://mp3.baidu.com/index.html
http://www.baidu.com/3.html
http://post.baidu.com/2.html
得到如下結(jié)果:
3 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
解法1:grep -Po '(?<=//)(.*?)(?=/)' test.txt |sort |uniq -c|sort -nr
1.利用了Perl,他支持非貪婪,2.利用了正向和反向預(yù)查(正向預(yù)查是后面的(?=)) 3.利用了-o參數(shù)只輸出匹配的內(nèi)容
解法2:awk -F/ '{print $3}' test.txt |sort |uniq -c|sort -nr
指明了分割符號(hào) 直接取對(duì)應(yīng)值
解法3:sed 's/http:\/\/\([^/]*\).*/\1/' test.txt|sort |uniq -c|sort -nr
基本的正則中小括號(hào)需要轉(zhuǎn)義,如果采用-r參數(shù)即擴(kuò)展的正則小括號(hào)不用轉(zhuǎn)義
解法4: sed -e 's/http:\/\///' -e 's/\/.*//' | sort | uniq -c | sort -rn
采用了替換,先替換前面的,在替換后面的
需要注意awk不支持多維數(shù)組,采用了一種變通的方式,普通的使用沒問題,但是如果需要存的值是一個(gè)map就不合適了,如下
文件 1-6列分別為deal od sum up lj day ,現(xiàn)在要計(jì)算sum up lj day 的累加和輸出
輸出也要是deal od sum up lj day也就是sum up lj day需要是一個(gè)map,不過awk做不到這點(diǎn)
{ updealids:{ od: {day,sum,up,lj} }}awk 'BEGIN{OFS="\t"}{result[$1,$3,"sum"] =$4;result[$1,$3,"up"] =$5;result[$1,$3,"lj"] =$6;result[$1,$3,"day"]=$2}END{for ( i in result) {split(i, a, SUBSEP); print result[i] ,a[1], a[2], a[3] }}' *
參考資料:
來源:https://www.icode9.com/content-4-587001.html聯(lián)系客服