shell中的流編輯器awk工作原理
awk命令
- awk是一種處理文本文件的語言,是一個(gè)強(qiáng)大的文本分析工具, 用于在linux/unix下對文本和數(shù)據(jù)進(jìn)行處理 。
- 而且它支持用戶自定義函數(shù)和動(dòng)態(tài)正則表達(dá)式等先進(jìn)功能,是linux/unix下的一個(gè)強(qiáng)大編程工具
awk工作原理
逐行讀取文本,默認(rèn)以空格或tab鍵為分隔符進(jìn)行分隔,將分隔所得的各個(gè)字段保存到內(nèi)建變量中,并按模式或者條件執(zhí)行編輯命令。
sed命令常用于一整行的處理,而awk比較傾向于將一行分成多個(gè)"字段"然后再進(jìn)行處理。
awk信息的讀入也是逐行讀取的,執(zhí)行結(jié)果可以通過print的功能將字段數(shù)據(jù)打印顯示。在使用awk命令的過程中,可以使用邏輯操作符 "&&“表示"與”、 “II"表示"或”、 "!“表示"非”; 還可以進(jìn)行簡單的數(shù)學(xué)運(yùn)算,如 +、一、*、/、%、^ 分別表示加、減、乘、除、取余和乘方。
awk的命令格式
awk 選項(xiàng) "模式或條件 [操作]" 文件1 文件2 awk -f 腳本文件 文件1 文件2
awk常見的內(nèi)建變量(可直接使用)
內(nèi)建變量 | 說明 |
---|---|
FS | 列分割符,制定和每行文本的字段分割符,默認(rèn)為空格或者制表符 |
NF | 當(dāng)前處理的行的字段個(gè)數(shù) |
NR | 當(dāng)前處理行的行號(序數(shù)) |
$0 | 當(dāng)前處理行的整行內(nèi)容 |
$n | 當(dāng)前處理行的第n個(gè)字段(第n列) |
FILENAME | 被處理的文件名 |
RS | 行分隔符,awk從文本上讀取資料時(shí),將根據(jù)RS的定義把資料切割成許多條記錄,而awk一次僅讀入一條,以進(jìn)行處理,預(yù)設(shè)值是\n |
awk按行輸出文本
awk '(NR>=1)&&(NR<=4){print}' 11.txt#輸出第一到第四行 111111 22222 233333 444444 awk '(NR==1)||(NR==4){print}' 11.txt#輸出第一和第四行 111111 444444 awk 'NR==1,NR==2{print}' 11.txt#輸出第一和第二行 111111 22222 awk '(NR%2)==1{print}' 11.txt#輸出奇數(shù)行 111111 233333 55555 awk '(NR%2)==0{print}' 11.txt#輸出偶數(shù)行 22222 444444 66666 awk '/^1/{print}' 11.txt#輸出以1為開頭的行 111111 awk '/2$/{print}' 11.txt#輸出以2為結(jié)尾的行 22222 awk 'BEGIN{x=0};/^2/{x++};END {print x}' 11.txt #統(tǒng)計(jì)以2開頭的行的行數(shù) 2
BEGIN模式表示,在處理指定文本之前,需要先執(zhí)行BEGIN模式中指定的動(dòng)作,awk再處理指定的文本,之后再執(zhí)行END模式中指定的動(dòng)作,END{}語句塊中,往往會(huì)放入打印結(jié)果等語句。
awk以字段輸出文本
字段3為用戶賬號的UID
字段4為所屬基本組賬號的GID
awk通過管道符,雙引號調(diào)用shell命令
getline
- 當(dāng)getline左右無重定向符“<”或“|”時(shí),getline作用于當(dāng)前文件,讀入當(dāng)前文件的第一行給其后跟的變量var或$0;應(yīng)該注意到,由于awk在處理getline之前已經(jīng)讀入了一行,所以getline得到的返回結(jié)果是隔行的。
- 當(dāng)getline左右有重定向符“<”或“|”時(shí),getline則作用于定向輸入文件,由于該文件是剛打開,并沒有被awk讀入一行,只是getline讀入,那么getline返回的是該文件的第一行,而不是隔行。
例:獲取本機(jī)ip,并轉(zhuǎn)換成二進(jìn)制
#!/bin/bash #獲取IP ifconfig | awk '(NR==2) {print $2}' #對分段后的IP地址賦值給一個(gè)變量 IP=`ifconfig |awk '(NR==2) {print $2}' | awk 'BEGIN {RS="."} ; {print} '` #進(jìn)行外層循環(huán),四次 for a in $IP do #進(jìn)行內(nèi)循環(huán),選用減法進(jìn)行循環(huán),如果外層循環(huán)的值比被減數(shù)大,則取余數(shù),并輸出1;反之則輸出0,且不取減法結(jié)果。 for ((i=1;i<=255;i+=$i)) do m=$[128/$i] sum=$[$a-$m] if [ $a -ge $m ] then a=$[$a-$m] echo -n "1" #不換行輸出 else echo -n "0" #不換行輸出 fi done echo " " #進(jìn)行系統(tǒng)默認(rèn)的空格換行操作 done> test.txt IP1="`cat test.txt`" echo $IP1 | sed 's/ /./g'
到此這篇關(guān)于shell中的流編輯器awk的文章就介紹到這了,更多相關(guān)shell編輯器awk內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。