【拔刀吧少年】之awk文本和数据处理编程语言
AWK
- 1. 什么是awk
- 2. 基本格式
- 3. 工作原理
- 4. 常見的內(nèi)建變量(可直接用)
- 5. 按行輸出文本
- 6. 按字段輸出文本
- 7. 通過管道、雙引號(hào)調(diào)用shell命令
- 8. 小案例 :awk集合getline、數(shù)組的用法
1. 什么是awk
AWK 是一種處理文本文件的語言,是一個(gè)強(qiáng)大的文本分析工具。
之所以叫 AWK 是因?yàn)槠淙×巳粍?chuàng)始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
相較于sed常常作用于一整個(gè)行的處理,awk則比較傾向于一行當(dāng)中分成數(shù)個(gè)字段來處理,因?yàn)閍wk相當(dāng)適合小型的文本數(shù)據(jù)。
2. 基本格式
awk后面接兩個(gè)單引號(hào)并加上大括號(hào){ }來設(shè)置想要對(duì)數(shù)據(jù)進(jìn)行的處理操作,awk可以處理后續(xù)接的文件,也可以讀取來自前個(gè)命令的標(biāo)準(zhǔn)輸,但如果awk主要是處理每一行的字段內(nèi)的數(shù)據(jù)時(shí),默認(rèn)的字段分隔符為“空格鍵”或“Tab鍵”
3. 工作原理
逐行讀取文本,默認(rèn)以空格或tab鍵為分隔符進(jìn)行分隔,將分隔所得的各個(gè)字段保存到內(nèi)建變量中, 并按模式或者條件執(zhí)行編輯命令。
sed命令常用于一整行的處理,而awk比較傾向于將一行分成多個(gè)"字段"然后再進(jìn)行處理。awk信息的讀入也是逐行讀取的,執(zhí)行結(jié)果可以通過print的功能將字段數(shù)據(jù)打印顯示。在使用awk命令的過程中,可以使用邏輯操作符"&&“表示"與”、"“表示"或”、"!“表示"非”;還可以進(jìn)行簡單的數(shù)學(xué)運(yùn)算,如+、-、*、/、%、^分別表示加、減、乘、除、取余和乘方。
4. 常見的內(nèi)建變量(可直接用)
FS∶ 列分割符。指定每行文本的字段分隔符,默認(rèn)為空格或制表位。與"-F"作用相同
NF∶ 當(dāng)前處理的行的字段個(gè)數(shù)。
NR∶ 當(dāng)前處理的行的行號(hào)(序數(shù))。
$0∶當(dāng)前處理的行的整行內(nèi)容。
$n∶ 當(dāng)前處理行的第n個(gè)字段(第n列)。
FILENAME∶ 被處理的文件名。
RS∶ 行分隔符。awk從文件上讀取資料時(shí),將根據(jù)RS的定義把資料切割成許多條記錄,而awk一次僅讀入一條記錄,以進(jìn)行處理。預(yù)設(shè)值是’\n’
FNR:awk當(dāng)前讀取的記錄數(shù),其變量值小于等于NR(比如當(dāng)讀取第二個(gè)文件時(shí),FNR是從0開始重新計(jì)數(shù),而NR不會(huì))。
NR==FNR:用于在讀取兩個(gè)或兩個(gè)以上的文件時(shí),判斷是不是在讀取第一個(gè)文件。
5. 按行輸出文本
實(shí)例1:輸出全部內(nèi)容
實(shí)例2:輸出第1到第3行的內(nèi)容
實(shí)例3:輸出第1行和第3行的內(nèi)容,輸出奇數(shù)和偶數(shù)行,像sed -n ‘n;p’
實(shí)例4:輸出包含指定字符的行
實(shí)例5:輸出包含指定字符的行并統(tǒng)計(jì)有多行
分析:
BEGIN模式表示,在處理指定的文本之前,需要先執(zhí)行BEGIN模式中指定的動(dòng)作;
awk再處理指定的文本,之后再執(zhí)行END模式中指定的動(dòng)作;
END{ } 語句塊中,往往會(huì)放入打印結(jié)果等語句。
6. 按字段輸出文本
實(shí)例1:輸出指定分隔符的指定字段
實(shí)例2:輸出指定字段在指定范圍內(nèi)的行,并選擇輸出的字段
實(shí)例3:awk結(jié)合三元運(yùn)算符的使用。
實(shí)例4:輸出行和內(nèi)容
實(shí)例5:輸出指定字段中包含指定字符的行,然后輸出指定字段。
7. 通過管道、雙引號(hào)調(diào)用shell命令
實(shí)例1:輸出文本內(nèi)容,結(jié)合awk以指定字符為分隔符,然后統(tǒng)計(jì)出行數(shù)。
實(shí)例2:awk結(jié)合管道命令使用
實(shí)例3:查看當(dāng)前內(nèi)存使用百分比
實(shí)例4:查看當(dāng)前系統(tǒng)的CPU的空閑率
實(shí)例5:顯示上次系統(tǒng)重啟的時(shí)間
8. 小案例 :awk集合getline、數(shù)組的用法
案例1:統(tǒng)計(jì)在線用戶的數(shù)量
分析:
當(dāng)getline左右無重定向符“<”或“1”時(shí),awk首先讀取到了第一行,就是1,然后getline, 就得到了1下面的第二行,就是2,因?yàn)間etline之后,awk會(huì)改變對(duì)應(yīng)的NF, NR,FNR和$0等 內(nèi)部變量,所以此時(shí)的$0的值就不再是1,而是2了,然后將它打印出來。
當(dāng)getline左右有重定向符“<”或“I”時(shí),getline則作用 于定向輸入文件,由于該文件是剛打開,并沒有被awk讀入一行,只是getline讀入那么getline返回的是該文件的第一行, 而不是隔行。
案例2:分別顯示0到10的奇數(shù)和偶數(shù)行
案例3:指定分隔符來分隔字符串
$1=$1是用來激活$0的重新賦值,也就是說
字段$1…和字段數(shù)NF的改變會(huì)促使awk重新計(jì)算$0的值,通常是在改變OFS后而需要輸出$0時(shí)這樣做
案例4:使用awk創(chuàng)建數(shù)組,并循環(huán)
案例5:使用awk來統(tǒng)計(jì)httpd訪問日志中每個(gè)客戶端IP出現(xiàn)的次數(shù),超過三次進(jìn)行提示。
awk ‘/Failed password/ {ip[$11]++}; END {for(i in ip){print i,ip[i]}}’ /var/log/secure
1.先測試好提取ip和次數(shù)的正確命令,方便我們直接在腳本里面使用。
2.根據(jù)第一步的命令再次使用awk進(jìn)行ip和次數(shù)的提取,然后做個(gè)if判斷即可。
3.測試結(jié)果
總結(jié)
以上是生活随笔為你收集整理的【拔刀吧少年】之awk文本和数据处理编程语言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【拔刀吧少年】之sed编辑器
- 下一篇: 【拔刀吧少年】之sort uniq tr