1. 程式人生 > >Linux awk

Linux awk

告訴 修改 i+1 則表達式 讀取 編程語言 命令 linux 開頭

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