liunx的awk詳情(上)
AWK是一種處理文本文件的語言,是一個強大的文本分析工具,可以報告生成器,格式化文本輸出
1.常用語法
awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] ‘BEGIN{ action;… } pattern{ action;… } END{ action;… }‘ file ...
2.常用選項
-F 指明輸入時用到的字段分隔符
-v var=value: 自定義
3.基本格式
awk [options] ‘program‘ file…
program:pattern{action statements;..}
pattern和action:
? pattern部分決定動作語句何時觸發及觸發事件
BEGIN,END
? action statements對數據進行處理,放在{}內指明
print, printf
(#要點
(1) 逗號分隔符
(2) 輸出的各item可以字符串,也可以是數值;當前記錄的字段、
變量或awk的表達式
(3) 如省略item,相當於print $0)
例:
~]# awk ‘{print "hello,awk"}‘
~]# awk –F: ‘{print}‘ /etc/passwd
~]# awk –F: ‘{print “wang”}’ /etc/passwd~]# awk –F: ‘{print $1}’ /etc/passwd
~]# awk –F: ‘{print $0}’ /etc/passwd
~]# awk –F: ‘{print $1”\t”$3}’ /etc/passwd
~]# awk -F: ‘{printf "username:%-20s salary:%-10.2f shell:%s\n",$1,$3,$7}‘ /etc/passwd
~]# tail -3 /etc/fstab |awk ‘{print $2,$4}‘
4.變量
變量:內置和自定義變量
FS:輸入字段分隔符,默認為空白字符
awk -v FS=‘:‘ ‘{print $1,FS,$3}’ /etc/passwdawk –F: ‘{print $1,$3,$7}’ /etc/passwd
OFS:輸出字段分隔符,默認為空白字符
awk -v FS=‘:’ -v OFS=‘:’ ‘{print $1,$3,$7}’ /etc/passwd
RS:輸入記錄分隔符,指定輸入時的換行符,原換行符仍有效
awk -v RS=‘ ‘ ‘{print }’ /etc/passwd
ORS:輸出記錄分隔符,輸出時用指定符號代替換行符
awk -v RS=‘ ‘ -v ORS=‘###‘‘{print }’ /etc/passwd
NF:字段數量
awk -F: ‘{print NF}’ /etc/fstab (#引用內置變量不用$)
awk -F: ‘{print $(NF-1)}‘ /etc/passwd
NR:行號
awk ‘{print NR}‘ /etc/fstab ; awk END‘{print NR}‘ /etc/fstab
FNR:各文件分別計數,行號
awk ‘{print FNR}‘ /etc/fstab /etc/inittab
FILENAME:當前文件名
awk ‘{print FILENAME}’ /etc/fstab
ARGC:命令行參數的個數
awk ‘{print ARGC}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
ARGV:數組,保存的是命令行所給定的各參數
awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab
(#要點:自定義變量{區分字符大小寫}
(1) -v var=value
(2) 在program中直接定義)
例:
awk -v test=‘hello gawk‘ ‘{print test}‘ /etc/fstab
awk -v test=‘hello gawk‘ ‘BEGIN{print test}‘
awk ‘BEGIN{test="hello,gawk";print test}‘
awk –F:‘{sex=“male”;print $1,sex,age;age=18}’ /etc/passwd
cat awkscript
{print script,$1,$2}
awk -F: -f awkscript script=“awk” /etc/passwd
5.printf命令
格式化並輸出結果到標準輸出。
1)格式化輸出:
格式化輸出:printf “FORMAT”, item1, item2, ...
必須指定FORMAT
不會自動換行,需要顯式給出換行控制符,\n
FORMAT中需要分別為後面每個item指定格式符
2)格式符:
格式符:與item一一對應
%c: 顯示字符的ASCII碼
%d, %i: 顯示十進制整數
%e, %E:顯示科學計數法數值
%f:顯示為浮點數
%g, %G:以科學計數法或浮點形式顯示數值
%s:顯示字符串
%u:無符號整數
%%: 顯示%自身
3)修飾符:
#[.#]:第一個數字控制顯示的寬度;第二個#表示小數點後精度,%3.1f
-: 左對齊(默認右對齊) %-15s
+:顯示數值的正負符號 %+d
例:
awk -F: ‘{printf "%s",$1}’ /etc/passwd
awk -F: ‘{printf "%s\n",$1}’ /etc/passwd
awk -F: ‘{printf "%-20s %10d\n",$1,$3}‘ /etc/passwd
awk -F: ‘{printf "Username: %s\n",$1}’ /etc/passwd
awk -F: ‘{printf “Username: %s,UID:%d\n",$1,$3}’/etc/passwd
awk -F: ‘{printf "Username: %15s,UID:%d\n",$1,$3}’ /etc/passwd
awk -F: ‘{printf "Username: %-15s,UID:%d\n",$1,$3}’ /etc/passwd
例:
1.用awk求出磁盤利用。
~]# df |grep /dev/sd |awk ‘{printf "DevName:%s Used:%s\n",$1,$5}‘
DevName:/dev/sda2 Used:19%
DevName:/dev/sda3 Used:1%
DevName:/dev/sda1 Used:55%
2.將/etc/passwd第一列當作姓名,第三列當作工資,打印報表,要求顯示:
Name:zhangsan Salary:3300 Level:High
工資大於3000的,Level顯示High,大於1000,小於等於3000的顯示Soso,小於1000的顯示LOW。
~]# awk -F: ‘{if($3>3000){Level="High"}else if($3>1000 && $3<=3000){Level="Soso"}else{Level="Low"};printf "Name:%-20s Salary:%-20d Level:%s\n",$1,$3,Level}‘ /etc/passwd
Name:root Salary:0 Level:Low
Name:bin Salary:1 Level:Low
Name:daemon Salary:2 Level:Low
Name:adm Salary:3 Level:Low
Name:lp Salary:4 Level:Low
......
3.利用echo {1..10},打印如下結果:
~]# echo {1..10} |awk ‘{i=1;while(i<=NF){if($i%2==0){print $i,"is oushu"} else{print $i, "is jishu"};i++}}‘
1 is jishu
2 is oushu
3 is jishu
4 is oushu
5 is jishu
6 is oushu
7 is jishu
8 is oushu
9 is jishu
10 is oushu
4.顯示文件的行
~]# awk ‘{i=1;sum=0;while(i<=NF){sum+=$i;i++};print sum}‘ x.txt #顯示每行各自的總行
55
155
~]# awk ‘{i=1;while(i<=NF){sum+=$i;i++};print sum}‘ x.txt #每行顯示一次總和
55
210
~]# awk ‘{i=1;while(i<=NF){sum+=$i;i++}}END{print sum}‘ x.txt #只顯示總和
210
liunx的awk詳情(上)