1. 程式人生 > >shell編程awk基礎介紹

shell編程awk基礎介紹

fst 語句塊 username $nf 就是 awk 連接 數據匯總 浮點

awk介紹

報告生成器,格式化文本輸出

處理機制類似sed命令,自帶循環處理 讀入一行處理一行然後自動讀取下一行再進行處理

sed命令換行的標識是固定的,只能是回車換行. awk裏面的換行符是可以自定義的.

awk自動把讀入的行按照指定的切割符號切割成若幹個字段 默認的切割符號是空白符號(包括連續的空白符號,tab鍵,回車換行符)

技術分享圖片

基礎語法

awk [options] ‘program‘ var=value file

awk [options] -f programfile var=value file

awk [options] ‘BEGIN{action;..} pattern{ action;....} END {action;....}‘ file

通常由: BEGIN語句塊 能夠使用模式匹配的通用語句塊 END語句塊 三部分組成

第一步: 先執行 BGEIN 語句塊 經常用於打印表頭

第二步: 從文件或者標準輸入讀取一行,然後執行pattern語句 它會逐行掃描文件,直到文件全部讀取完畢

第三步: 處理完文件或者輸入流的最後一行後,最後執行的語句塊 經常用於進行數據匯總

pattern語句如果沒有提供 默認執行 {print } 就是打印每一個讀取到的行

選項 options

-F 指明輸入時用到的字段分隔符號

-v var=value 自定義變量

awk內置變量

FS 表示把行按照這個變量進行切割成列
OFS 表示按這個字符把列進行拼裝組合輸出
RS 表示按照這個變量作為行的分隔符
ORS 表示以這個符號連接每行輸出的結果
NF 表示字段的數量大小
NR 表示行號
FNR 多個文件的時候各自的文件行號
FILENAME 表示當前的文件名稱

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,"----"$NF"----"$(NF-1)}‘ /etc/passwd

引用內置變量不用$

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 ARGV[0]代表的awk自己本身 ARGV[1] 代表/etc/fstab ARGV[2]代表/etc/inittab

awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab

awk自定義變量

自定義變量(區分字符大小寫)

(1) -v var=value

(2) 在program中直接定義

(3) 變量最好先定義賦值然後再去使用

printf格式化輸出

1.輸出信息默認不會換行,需要顯示指定換行控制符 \n

格式符:

1. %c 顯示字符的ASCII碼

2. %d,%i 顯示十進制數字

3. %s 顯示字符串

4. %% 顯示%自身

5. %f 顯示浮點數

awk -F: ‘{printf "%s:%s\n",$1,$3}‘ /etc/passwd

awk -F: ‘BEGIN{print "username uid"}{printf"%s %s\n", $1,$3}‘ /etc/passwd

awk實例

技術分享圖片
 1 從文件中讀取program
 2 cat awkscript  
 3   {print script,$1,$2} 
 4 [root@centos7 ~]# awk -F: -f awkscript script="awkkk" /etc/passwd
 5 awkkk root x
 6 awkkk bin x
 7 awkkk daemon x
 8 [root@centos7 ~]# awk -F: {printf"Username: %s\n",$1} /etc/passwd
 9 Username: root
10 Username: bin
11 Username: daemon
12 輸出json字典
13 [root@centos7 ~]# awk -F: {printf "Username:%s,UID:%d\n",$1,$3} /etc/passwd
14 Username:root,UID:0
15 Username:bin,UID:1
16 [root@centos7 ~]# awk -F: $0 ~ /root/{print $1} /etc/passwd
17 root
18 operator
19 rooter
20 [root@centos7 ~]# awk -F: $0 ~ /^root/{print $1} /etc/passwd
21 root
22 rooter
23 awk $0 !~ /root/ /etc/passwd
24 bin:x:1:1:bin:/bin:/sbin/nologin
25 daemon:x:2:2:daemon:/sbin:/sbin/nologin
26 [root@centos7 ~]# awk -F: $3==0 /etc/passwd
27 root:x:0:0:root:/root:/bin/bash
View Code 技術分享圖片
 1 [root@centos7 ~]# awk {print 2^10}
 2 e
 3 1024
 4 [root@centos7 ~]# awk -F: {print $1":"$3} /etc/passwd
 5 root:0
 6 bin:1
 7 daemon:2
 8 [root@centos7 ~]# df | awk {print $1,$3}
 9 Filesystem Used
10 /dev/sda2 4347496
11 devtmpfs 0
12 tmpfs 0
13 [root@centos7 ~]# awk -v FS=: {print $1,$3} /etc/passwd
14 root 0
15 [root@centos7 ~]# awk -v FS=: {print $1FS$3} /etc/passwd
16 root:0
17 shell變量傳遞給awk
18 [root@centos7 ~]# fs=":";awk -v FS=$fs {print $1FS$3} /etc/passwd
19 root:0
20 bin:1
21 
22 [root@centos7 ~]# awk -v ORS="****" {print $1} a2
23 1****3****o****2****o****4****You have new mail in /var/spool/mail/root
24 [root@centos7 ~]# awk {print $1} a2
25 1
26 3
27 o
28 2
29 o
30 4
View Code 技術分享圖片
 1 [root@centos7 ~]# df | grep ^/dev/sd|awk {print $1,$5}
 2 /dev/sda2 9%
 3 /dev/sda3 1%
 4 /dev/sda1 20%
 5 [root@centos7 ~]# df | grep ^/dev/sd|awk -v FS=% {print $1}
 6 /dev/sda2       52403200 4347456  48055744   9
 7 /dev/sda3       31441920   83004  31358916   1
 8 /dev/sda1        1038336  198256    840080  20
 9 [root@centos7 ~]# df | grep ^/dev/sd|awk -v FS=% {print $1}|awk {print $1,$5}
10 /dev/sda2 9
11 /dev/sda3 1
12 /dev/sda1 20
13 [root@centos7 ~]# awk -F: {print NF,$NF,$(NF-1)} /etc/passwd
14 7 /bin/bash /root
15 7 /sbin/nologin /bin
16 7 /sbin/nologin /sbin
17 7 /sbin/nologin /var/adm
18 7 /sbin/nologin /var/spool/lpd
View Code

shell編程awk基礎介紹