亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Linux Shell > 正文

linux文本分析awk基礎命令介紹(8)

2020-07-27 18:59:32
字體:
來源:轉載
供稿:網友

awk是一種模式掃描和處理語言,在對數據進行分析處理時,是十分強大的工具。

awk [options] 'pattern {action}' file...

awk的工作過程是這樣的:按行讀取輸入(標準輸入或文件),對于符合模式pattern的行,執行action。當pattern省略時表示匹配任何字符串;當action省略時表示執行'{print}';它們不可以同時省略。
每一行輸入,對awk來說都是一條記錄(record),awk使用$0來引用當前記錄:

[root@centos7 ~]# head -1 /etc/passwd | awk '{print $0}'root:x:0:0:root:/root:/bin/bash

例子中將命令head -1 /etc/passwd作為awk的輸入,awk省略了pattern,action為print $0,意為打印當前記錄。
對于每條記錄,awk使用分隔符將其分割成列,第一列用$1表示,第二列用$2表示...最后一列用$NF表示

選項-F表示指定分隔符
如輸出文件/etc/passwd第一行第一列(用戶名)和最后一列(登錄shell):

[root@centos7 ~]# head -1 /etc/passwd | awk -F: '{print $1,$NF}'root /bin/bash

當沒有指定分隔符時,使用一到多個blank(空白字符,由空格鍵或TAB鍵產生)作為分隔符。輸出的分隔符默認為空格。
如輸出命令ls -l *的結果中,文件大小和文件名:

[root@centos7 temp]# ls -l * | awk '{print $5,$NF}'13 b.txt58 c.txt12 d.txt0 e.txt0 f.txt24 test.sh[root@centos7 temp]# 

還可以對任意列進行過濾:

[root@centos7 temp]# ls -l *|awk '$5>20 && $NF ~ /txt$/'-rw-r--r-- 1 nobody nobody 58 11月 16 16:34 c.txt

其中$5>20表示第五列的值大于20;&&表示邏輯與;$NF ~ /txt$/中,~表示匹配,符號//內部是正則表達式。這里省略了action,整條awk語句表示打印文件大小大于20字節并且文件名以txt結尾的行。

awk用NR表示行號

[root@centos7 temp]# awk '/^root/ || NR==2' /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin[root@centos7 temp]#

例子中||表示邏輯或,語句表示:輸出文件/etc/passwd中以root開頭的行或者第二行。

在一些情況下,使用awk過濾甚至比使用grep更靈活
如獲得ifconfig的輸出中網卡名及其對應的mtu值

[root@idc-v-71253 ~]# ifconfig|awk '/^/S/{print $1"/t"$NF}'ens32: 1500ens33: 1500lo:   65536[root@idc-v-71253 ~]# #這里的正則表示不以空白字符開頭的行,輸出內容中使用/t進行了格式化。

以上所說的NR、NF等都是awk的內建變量,下面列出部分常用內置變量

$0     當前記錄(這個變量中存放著整個行的內容)$1~$n    當前記錄的第n個字段,字段間由FS分隔FS     輸入字段分隔符 默認是空格或TabNF     當前記錄中的字段個數,就是有多少列NR     行號,從1開始,如果有多個文件話,這個值也不斷累加。FNR     輸入文件行號RS     輸入的記錄分隔符, 默認為換行符OFS     輸出字段分隔符, 默認也是空格ORS     輸出的記錄分隔符,默認為換行符FILENAME  當前輸入文件的名字

awk中還可以使用自定義變量,如將網卡名賦值給變量a,然后輸出網卡名及其對應的RX bytes的值(注意不同模式匹配及其action的寫法):

[root@idc-v-71253 ~]# ifconfig|awk '/^/S/{a=$1}/RX p/{print a,$5}'ens32: 999477100ens33: 1663197120lo: 0

awk中有兩個特殊的pattern:BEGIN和END;它們不會對輸入文本進行匹配,BEGIN對應的action部分組合成一個代碼塊,在任何輸入開始之前執行;END對應的action部分組合成一個代碼塊,在所有輸入處理完成之后執行。

#注意類似于C語言的賦值及print函數用法[root@centos7 temp]# ls -l *|awk 'BEGIN{print "size name/n---------"}$5>20{x+=$5;print $5,$NF}END{print "---------/ntotal",x}'size name---------58 c.txt24 test.sh---------total 82[root@centos7 temp]#

awk還支持數組,數組的索引都被視為字符串(即關聯數組),可以使用for循環遍歷數組元素
如輸出文件/etc/passwd中各種登錄shell及其總數量

#注意數組賦值及for循環遍歷數組的寫法[root@centos7 temp]# awk -F ':' '{a[$NF]++}END{for(i in a) print i,a[i]}' /etc/passwd/bin/sync 1/bin/bash 2/sbin/nologin 19/sbin/halt 1/sbin/shutdown 1[root@centos7 temp]# 

當然也有if分支語句

#注意大括號是如何界定action塊的[root@centos7 temp]# netstat -antp|awk '{if($6=="LISTEN"){x++}else{y++}}END{print x,y}'6 3[root@centos7 temp]# 

pattern之間可以用逗號分隔,表示從匹配第一個模式開始直到匹配第二個模式

[root@centos7 ~]# awk '/^root/,/^adm/' /etc/passwd    root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologin

還支持三目操作符pattern1 ? pattern2 : pattern3,表示判斷pattern1是否匹配,true則匹配pattern2,false則匹配pattern3,pattern也可以是類似C語言的表達式。
如判斷文件/etc/passwd中UID大于500的登錄shell是否為/bin/bash,是則輸出整行,否則輸出UID為0的行:

#注意為避免混淆對目錄分隔符進行了轉義[root@centos7 ~]# awk -F: '$3>500?///bin//bash$/:$3==0 {print $0}' /etc/passwd     root:x:0:0:root:/root:/bin/bashlearner:x:1000:1000::/home/learner:/bin/bash#三目運算符也可以嵌套,例子略

選項-f file表示從file中讀取awk指令

#打印斐波那契數列前十項[root@centos7 temp]# cat test.awk BEGIN{  $1=1  $2=1  OFS=","  for(i=3;i<=10;i++)  {    $i=$(i-2)+$(i-1)  }  print}[root@centos7 temp]# awk -f test.awk 1,1,2,3,5,8,13,21,34,55[root@centos7 temp]# 

選項-F指定列分隔符

#多個字符作為分隔符時[root@centos7 temp]# echo 1.2,3:4 5|awk -F '[., :]' '{print $2,$NF}'2 5[root@centos7 temp]##這里-F后單引號中的內容也是正則表達式

選項-v var=val設定變量

#這里printf函數用法類似C語言同名函數[root@centos7 ~]# awk -v n=5 'BEGIN{for(i=0;i<n;i++) printf "%02d/n",i}' 0001020304[root@centos7 ~]# 

print等函數還支持使用重定向符>和>>將輸出保存至文件

#如按第一列(IP)分類拆分文件access.log,并保存至ip.txt文件中[root@centos7 temp]# awk '{print > $1".txt"}' access.log [root@centos7 temp]# ls -l 172.20.71.*-rw-r--r-- 1 root root 5297 11月 22 21:33 172.20.71.38.txt-rw-r--r-- 1 root root 1236 11月 22 21:33 172.20.71.39.txt-rw-r--r-- 1 root root 4533 11月 22 21:33 172.20.71.84.txt-rw-r--r-- 1 root root 2328 11月 22 21:33 172.20.71.85.txt

內建函數
length()獲得字符串長度

[root@centos7 temp]# awk -F: '{if(length($1)>=16)print}' /etc/passwd systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin[root@centos7 temp]#

split()將字符串按分隔符分隔,并保存至數組

[root@centos7 temp]# head -1 /etc/passwd|awk '{split($0,arr,/:/);for(i=1;i<=length(arr);i++) print arr[i]}'rootx00root/root/bin/bash[root@centos7 temp]# 

getline從輸入(可以是管道、另一個文件或當前文件的下一行)中獲得記錄,賦值給變量或重置某些環境變量

#從shell命令date中通過管道獲得當前的小時數[root@centos7 temp]# awk 'BEGIN{"date"|getline;split($5,arr,/:/);print arr[1]}'09#從文件中獲取,此時會覆蓋當前的$0。(注意逐行處理b.txt的同時也在逐行從c.txt中獲得記錄并覆蓋$0,當getline先遇到eof時<即c.txt文件行數較少>將輸出空行)[root@centos7 temp]# awk '{getline <"c.txt";print $4}' b.txt "https://segmentfault.com/blog/learnning"[root@centos7 temp]# #賦值給變量[root@centos7 temp]# awk '{getline blog <"c.txt";print $0"/n"blog}' b.txt aasdasdadsadBLOG ADDRESS IS "https://segmentfault.com/blog/learnning"[root@centos7 temp]# #讀取下一行(也會覆蓋當前$0)[root@centos7 temp]# cat fileanny100bob150cindy120[root@centos7 temp]# awk '{getline;total+=$0}END{print total}' file370#此時表示只對偶數行進行處理

next作用和getline類似,也是讀取下一行并覆蓋$0,區別是next執行后,其后的命令不再執行,而是讀取下一行從頭再執行。

#跳過以a-s開頭的行,統計行數,打印最終結果[root@centos7 temp]# awk '/^[a-s]/{next}{count++}END{print count}' /etc/passwd2[root@centos7 temp]# #又如合并相同列的兩個文件[root@centos7 temp]# cat f.txt 學號 分值00001 8000002 7500003 90[root@centos7 temp]# cat e.txt 姓名 學號張三 00001李四 00002王五 00003[root@centos7 temp]# awk 'NR==FNR{a[$1]=$2;next}{print $0,a[$2]}' f.txt e.txt  姓名 學號 分值張三 00001 80李四 00002 75王五 00003 90#這里當讀第一個文件時NR==FNR成立,執行a[$1]=$2,然后next忽略后面的。讀取第二個文件時,NR==FNR不成立,執行后面的打印命令

sub(regex,substr,string)替換字符串string(省略時為$0)中首個出現匹配正則regex的子串substr

[root@centos7 temp]# echo 178278 world|awk 'sub(/[0-9]+/,"hello")'hello world[root@centos7 temp]#

gsub(regex,substr,string)與sub()類似,但不止替換第一個,而是全局替換

[root@centos7 temp]# head -n5 /etc/passwd|awk '{gsub(/[0-9]+/,"----");print $0}'   root:x:----:----:root:/root:/bin/bashbin:x:----:----:bin:/bin:/sbin/nologindaemon:x:----:----:daemon:/sbin:/sbin/nologinadm:x:----:----:adm:/var/adm:/sbin/nologinlp:x:----:----:lp:/var/spool/lpd:/sbin/nologin

substr(str,n,m)切割字符串str,從第n個字符開始,切割m個。如果m省略,則到結尾

[root@centos7 temp]# echo "hello,世界!"|awk '{print substr($0,8,1)}'界[root@centos7 temp]#

tolower(str)和toupper(str)表示大小寫轉換

[root@centos7 temp]# echo "hello,世界!"|awk '{A=toupper($0);print A}'HELLO,世界![root@centos7 temp]#

system(cmd)執行shell命令cmd,返回執行結果,執行成功為0,失敗為非0

#此處if語句判斷和C語言一致,0為false,非0為true[root@centos7 temp]# awk 'BEGIN{if(!system("date>/dev/null"))print "success"}'success[root@centos7 temp]# 

match(str,regex)返回字符串str中匹配正則regex的位置

[root@centos7 temp]# awk 'BEGIN{A=match("abc.f.11.12.1.98",/[0-9]{1,3}/./);print A}'7[root@centos7 temp]# 

awk作為一個編程語言可以處理各種各樣的問題,甚至于編寫應用軟件,但它更常用的地方是命令行下的文本分析,生成報表等,這些場景下awk工作的很好。工作中如經常有文本分析的需求,那么掌握這個命令的用法將為你節省大量的時間。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品视频在线观看| 欧美成人三级视频网站| 日韩中文在线中文网在线观看| 欧美最猛性xxxxx亚洲精品| 国产精品色午夜在线观看| 国产成人综合精品| 欧美电影免费观看电视剧大全| 色综合91久久精品中文字幕| 亚洲色图校园春色| 91在线看www| 成人精品一区二区三区电影黑人| 韩国19禁主播vip福利视频| 中文字幕日韩欧美在线| 综合av色偷偷网| 日韩国产精品视频| 亚洲最新在线视频| 欧美日韩成人在线观看| 日韩av一卡二卡| 欧美成人精品一区二区| 亚洲2020天天堂在线观看| 欧美激情免费在线| 国产精品aaa| 久久精品国产成人| 日韩在线一区二区三区免费视频| 亚洲爱爱爱爱爱| 亚洲无限av看| 一区二区三区无码高清视频| 91精品免费视频| 久久久97精品| 在线精品高清中文字幕| 国产精品成人国产乱一区| 国产成人在线一区| 最近2019年好看中文字幕视频| 欧美丰满少妇xxxxx| 亚洲国产中文字幕久久网| 日韩视频一区在线| 欧美国产中文字幕| 色香阁99久久精品久久久| 欧美丰满少妇xxxx| 国产91精品高潮白浆喷水| 国产成人亚洲精品| 欧美成人免费全部观看天天性色| 日韩av一区二区在线观看| 亚洲精选一区二区| 美女视频黄免费的亚洲男人天堂| 日本高清视频精品| 97超碰色婷婷| 日韩中文视频免费在线观看| 亚洲xxx视频| 欧美日韩国产999| 国产一区二区三区在线视频| 成人天堂噜噜噜| 欧美一区二区三区艳史| 国产精品一区二区久久久久| 68精品久久久久久欧美| 国产精品久久久久久久久影视| 亚洲社区在线观看| 国产精品国产三级国产专播精品人| www.欧美精品一二三区| 午夜精品一区二区三区av| 日韩小视频网址| 亚洲男人天堂2024| 欧美激情视频网站| 中文字幕亚洲一区在线观看| 精品爽片免费看久久| 一本一本久久a久久精品牛牛影视| 国产视频久久网| 国产精品成人一区二区三区吃奶| 国产亚洲人成网站在线观看| 日韩av免费在线看| 国产精品久久网| 亚洲一区二区三区毛片| 91人成网站www| 国语自产精品视频在线看| 日韩精品亚洲精品| 成人国内精品久久久久一区| 欧美色视频日本高清在线观看| 九九久久精品一区| 亚洲精品国产精品国产自| 尤物精品国产第一福利三区| 97人洗澡人人免费公开视频碰碰碰| 国产成人+综合亚洲+天堂| 啊v视频在线一区二区三区| 日韩av影视综合网| 亚洲自拍偷拍色片视频| 欧美国产日韩免费| 91精品国产乱码久久久久久久久| 欧美高清视频在线播放| 欧美日韩午夜视频在线观看| 国产精品电影网| 日韩精品视频免费专区在线播放| 国产成人精品一区二区在线| 欧美肥臀大乳一区二区免费视频| 国产欧美最新羞羞视频在线观看| 久久久久久久香蕉网| 国产精品ⅴa在线观看h| 在线观看欧美日韩国产| 亚洲人成人99网站| 久久久久女教师免费一区| 欧美性xxxx极品高清hd直播| 久久色免费在线视频| 这里只有精品视频在线| 色www亚洲国产张柏芝| 91国在线精品国内播放| 欧美视频在线观看 亚洲欧| 日韩精品在线看| 国产在线观看一区二区三区| 久久综合伊人77777蜜臀| 亚洲国产精品视频在线观看| 国产精品私拍pans大尺度在线| 91成人福利在线| 91国偷自产一区二区三区的观看方式| 国产精品美腿一区在线看| 欧美日韩国产成人| 国产aⅴ夜夜欢一区二区三区| 国产精品网红福利| 欧美色另类天堂2015| 久久视频在线视频| 成人精品久久一区二区三区| 久久九九全国免费精品观看| 久久激情视频免费观看| 国产欧美中文字幕| 国产欧美精品在线| 91日韩在线播放| 国产91色在线|免| 日韩精品免费在线播放| 亚洲精品在线观看www| 国产精品99久久久久久久久久久久| 欧美日韩国产丝袜另类| 国产精品亚洲综合天堂夜夜| 国产精品入口尤物| 成人精品视频99在线观看免费| 97热精品视频官网| 日韩电影中文字幕| 欧美高清视频在线观看| 色午夜这里只有精品| 亚洲综合中文字幕在线| 日韩成人网免费视频| 欧洲亚洲妇女av| 欧美日韩高清在线观看| 欧美巨猛xxxx猛交黑人97人| 色偷偷av一区二区三区| 欧美日韩国产页| 亚洲美女中文字幕| 亚洲自拍另类欧美丝袜| 姬川优奈aav一区二区| 欧美高清激情视频| 亚洲第一精品久久忘忧草社区| 久久在线免费观看视频| 亚洲一区二区三区在线视频| 欧美日韩中文在线观看| 欧美大片免费观看| 亚洲色图狂野欧美| 美女久久久久久久| 亚洲欧洲偷拍精品| 国产脚交av在线一区二区| 亚洲久久久久久久久久久| 欧美激情视频在线免费观看 欧美视频免费一| 欧美一级bbbbb性bbbb喷潮片| 亚洲精品视频中文字幕| 91精品国产综合久久香蕉| 91精品国产免费久久久久久| 欧美成人网在线| 日本sm极度另类视频|