Linux awk
awk命令不僅僅是Linux系統的命令,也是一種編程語言,用來處理數據和生成報告(Exel),處理的數據可以是一個或多個文件(標準輸入和管道獲取標準輸入)。可在命令行上編輯操作,也可以寫成awk程序運用。
awk格式
awk -F “參數” ‘BEGIN{} 模式 {動作} END{}’ 文件路徑
參數
-F :指定按照什麽標誌進行文件的切割,切割成一列一列的,如何不指定-F參數,awk默認按照空格進行文本的切割。{}中的print代表輸出的意思;
"$"代表取列,$1就是取第一列,以此類推
$NF:取每行的最後一列內容,默認取每行的最後一組元素
分隔符是 "(雙引號) 條件是‘(單引號)
BEGIN{}:告訴awk如何讀取;END:告訴awk程序要如何結束
RS:讀入換行符 ; ORS:輸出換行符
\n :換行符
輸出的以冒號為分割符的第一列
沒加大括號就是模式,模式就是篩選數據的,有動作在執行動作,不寫動作默認輸出全部
基本的模式和動作
awk -F ":" ‘NR>=2 &&NR<=6{print NR,$1}‘ /etc/passwd
命令說明:-F指定分隔符為冒號,相當於以“:”為菜刀,進行字段的切割。NR>=2 && NR<=6:這部分表示模式,是一個條件,表示取第2行到第6行。{print NR,$1}:這部分表示動作,表示要輸出NR行號和$1第一列。
只有模式
awk -F ":" ‘NR>=2&&NR<=6‘ /etc/passwd
命令說明:NR>=2&&NR<=6這部分是條件,表示第2行到第6行。但是這裏沒有動作,這裏大家學要了解如果只有條件(模式)沒有動作,awk默認輸出整行
只有動作
awk -F ":" ‘{print NR,$1}‘ /etc/passwd
命令說明:這裏沒有模式,表示對每一行都處理,{print NR,$1}表示動作,顯示NR行號與$1第一列,也就是沒有模式的時候,awk會處理每一行
多個模式和動作
awk -F ":" ‘NR==1{print NR,$1}NR==2{print NR,$NF}‘ /etc/passwd
命令說明:這裏有多個條件與動作的組合 ,NR==1表示條件,行號(NR)等於1的條件滿足的時候,執行{print NR,$1}動作,輸出行號與第一列。NR==2表示條件,行號(NR)等於2的條件滿足的時候,執行{print NR,$NF}動作,輸出行號與最後一列
awk執行過程小結:
1 .awk讀入第一行內容
2.判斷是否符合模式中的條件NR>=2 ,a,如果匹配則執行對應的動作{print $0},b如果不匹配條件,繼續讀取下一行
3.繼續讀取下一行
4.重復過程1-3,直到讀取最後一行
awk模式有四種:
正則表達式作為模式
比較表達式作為模式
範圍模式
特殊模式BEGIN和END
正則表達式模式
顯示第9列是200的行的IP地址
# awk ‘$9~/^200$/ {print $1}’ access.log
在第9列模式下,~進行正則匹配操作,以200開頭,以200結尾過濾,
打印$1,顯示IP地址
# awk ‘$9~/^404$/ {print $1}’ access.log | sort | uniq -c
在上述基礎上,排序並去重、計數
或# awk ‘$9==”404” {print $1}’ access.log | sort | uniq -c
顯示姓zhang的人的第二次捐款金額及他的名字
# awk -F “[ :]+” ‘$1~/^zhang/ {print $2,$(NF-1)}’ /server/files/reg.txt
顯示xiaoyu的姓氏和ID號碼
awk -F “[ : ]+” ‘$2~/^xiaoyu/ {print $1,3$}’ /server/files/reg.txt
顯示所有以41開頭的ID號碼的人的全名和ID號碼
awk -F “[ :]+” ‘$3~/~41/ {print $1,$2,$3}’ /server/files/reg.txt
顯示所有以一個D或X開頭的人名全名
awk -F “[: ]+” ‘$2~/^d|^x/ {print $1,$2}’ /server/files/reg.txt
顯示所有ID號碼最後一位數字是1或5的人的全名
awk -F “[ :]+” ‘$3~/1$|5$/ {print $1,$2}’ /server/files/reg.txt
顯示xiaoyu的捐款,每個值都有以$開頭,如$520$200$135
awk -F “[ :]+” ‘$2~/xiaoyu/ {print “$”$4”$”$5”$”$6}’ /server/files/reg.txt
顯示所有人的全名,以姓、名的格式顯示,如meng,feixue
awk -F “[ :]+” ‘{print $1”,”$2}’ /server/files/reg.txt
取網卡的IP地址
第一種
ifconfig eth0 | sed -n ‘2p‘ | awk -F "[ :]+" ‘{print $4}‘
第二種
ifconfig eth0 | awk -F "[ :]+" ‘NR==2{print $2}‘
第三種
ifconfig eth0 | awk ‘BEGIN{RS="[ :]}NR==31‘
第四種
hostname -I
比較表達式模式
取出文件/etc/services的23-30行
awk ‘NR>=23&&NR<=30’ /etc/services
awk ‘NR>22&&NR<31’ /etc/services
判斷某一列是否等於某個字符,找出/etc/passwd中第五列是root的行
awk -F":" ‘$5=="root"‘ /server/files/awk_equal.txt
awk -F":" ‘$5~/^root$/‘ /server/files/awk_equal.txt
找出工資在(40000,60000)之間的員工名字
awk -F: ‘$3>=”40000” && $3<=”60000” {print $1}’ test2
範圍模式
顯示第二行到第五行的行好和整行的內容
awk ‘NR==2,NR==5{print NR,$0}‘ count.txt
顯示以bin開頭,到第五行的行號及整行內容
awk ‘/^bin/,NR==5{print NR,$0}‘ awkfile.txt
從第三列以bin開始的行到以lp開頭的行並顯示其行號和整行內容
awk -F":" ‘$5~/^bin/,/^lp/{print NR,$0}‘ awkfile.txt
從第三列以bin開頭字符串的行到第三列以lp開頭字符串的行
awk -F: ‘$5~/^bin/,$5~/^lp/{print NR,$0}‘ awkfile.txt
BEGIN模塊
(1)定義內置變量(-F本質式修改的FS變量)
# ifconfig eth0|awk -F "(addr:)|( Bcast:)" ‘NR==2{print $2}‘
相當於# ifconfig eth0 | awk ‘BEGIN{FS="(addr:)|( Bcast:)"} NR==2{print $2}‘
# ifconfig eth0 | awk -F "[ :]+" ‘NR==2{print $4}‘
相當於# ifconfig eth0 | awk ‘BEGIN{FS="[ :]+"}NR==2{print $4}‘
# ifconfig eth0 | awk -F "[^0-9.]+" ‘NR==2{print $2}‘
相當於# ifconfig eth0 | awk ‘BEGIN{FS="[^0-9.]+"}NR==2{print $2}‘
(2)在讀取文件之前,輸出提示性信息(表頭)
# awk -F ":" ‘BEGIN{print "1111","2222"} {print $1,$3} ‘ yunjisuan.txt
# awk -F ":" ‘BEGIN{print "1111","2222"} {print $1,$3} END{print "asdf","asdfg"}‘ yunjisuan.txt
(3)使用BEGIN 模塊的特殊性質,進行一些測試(計算)
計算數值
# awk ‘BEGIN{print 10/3}‘
賦值變量
# awk ‘BEGIN{a=1;b=2;print a,b,a+b}‘
awk中字母會被認為是變量,給一個變量賦值字母(字符串),用雙引號
# awk ‘BEGIN{abcd=123456;a=abcd;print a}‘
123456
# awk ‘BEGIN{a="abcd";print a}‘
abcd
表示a的b次方
# awk ‘BEGIN{a=2;b=3;print a**b}’
查看/etc/services空行個數
方法一:
# grep -c “^$” /etc/services
方法二:
# awk ‘/^$/ {i=i+1} END{print i}’ /etc/services
其中,i=i+1 等同於i++
查看test文件一共有多少行
# awk ‘{i++}END{print i}’ test
求test文件每行的值之和
# awk ‘{i=i+$0}END{print i}’ test
求 test文件每行的值之積(BEGIN初始變量設定位置)
# awk ‘BEGIN{i=1}{i=i*$1}END{print i}’ test
Linux awk