linux的awk詳情(上)

一丶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/passwd
awk –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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章