awk命令

簡介

awk命令的名稱來自其創始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 三個人姓氏的首字母。

awk命令實際上擁有自己的語言,即awk程序設計語言。三位創始人將語言命名爲“樣式掃描和處理語言”。awk允許創建簡短的程序,用來讀取輸入文件,爲數據排序,處理數據,對輸入執行計算,生成報表等。

格式

awk命令的通用的語法格式爲:

awk '{pattern + action}' {filenames}

其中pattern表示awk在數據中查找的內容。

action表示在找到匹配的內容後所需執行的一系列命令。

花括號{}用於根據特定的模式對一系列指令進行分組。

awk語言最基本的功能是在文件或者字符串中基於指定的規則瀏覽和抽取信息,根據抽取的信息執行相應的文本操作。

通常awk命令是以文件的“行”爲處理單位。

實例

例如如下的實例:

[jamza@A23488809 master]$ awk '{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:4:sync:/sbin:/bin/sync
shutdown:x:6:4:shutdown:/sbin:/sbin/shutdown
halt:x:7:4:halt:/sbin:/sbin/halt
operator:x:11:4:operator:/root:/sbin/nologin

#調用awk命令,指定 /etc/passwd 作爲輸入文件
#執行awk命令時,依次對/etc/passwd中的每一行執行{}中的print命令
#變量$0表示整行數據

再比如:

[jamza@A23488809 master]$ awk -F":" '{print $1}' /etc/passwd
root
bin
daemon
adm
sync
shutdown
halt

#調用awk命令,-F選項指定的每一行的字符分隔符爲“:”
#變量$1表示按照分隔符,每一行分割的多列中的第一列,依次類推,$2、$3等分別表示第二列,第三列……

再比如:

[jamza@A23488809 master]$ awk -F":" '{ print $1 "^^^" $6 }' /etc/passwd
root^^^/root
bin^^^/bin
daemon^^^/sbin
adm^^^/var/adm
sync^^^/sbin
shutdown^^^/sbin
halt^^^/sbin

#print輸出可以按照指定的格式輸出數據

特殊的變量定義:

$0:表示整個當前行

$1:表示每行的第一個字段

$2:表示每行的第二個字段,依此類推

NF:表示每行的字段數量,比如/etc/passwd中的每行,按照:分割,有7個字段

NR:表示每行的記錄號,即行號,從1開始,多文件記錄遞增

FNR:與NR類似,但是多文件記錄不遞增,每個文件都從1開始

\t:製表符

\n:換行符

FS:在BEGIN模塊時定義的分隔符

RS:記錄的分隔符,即每行的換行符。

BEGIN模塊與END模塊

通常對於每個輸入行,awk都會執行每個腳本代碼塊一次,但是在許多編程情況下,可能需要在awk開始處理輸入文件中的文本之前,執行初始化代碼,因此awk允許定義一個BEGIN模塊。

一般在BEGIN模塊,會執行初始化字段分隔符(FS)變量,打印頁眉,初始化全局變量等。

另外,在處理了輸入文件中的所有行之後,會執行END模塊,END模塊用於執行最終計算。

比如,統計/etc/passwd中的賬戶人數:

[jamza@A23488809 master]$ awk '{count++;} END{print "user count is ",count}' /etc/passwd
user count is  27

[jamza@A23488809 master]$ awk 'BEGIN {count=0;print "[start] user count is ",count} {count=count+1} END{print "[end] user count is ",count}' /etc/passwd
[start] user count is  0
[end] user count is  27

比如,統計某個文件夾下的文件佔用的字節數:

[jamza@A23488809 master]$ ll
總用量 1001060
drwxrwxr-x 5 jamza jamza        152 4月  11 13:56 base
-rw-rw-r-- 1 jamza jamza        130 3月  25 15:57 Dockerfile
-rw-rw-r-- 1 jamza jamza 1002212560 4月  11 13:56 docker_no_cntr_no_lpm_base.set
-rw-r--r-- 1 jamza jamza   13800882 3月  25 10:01 libarch_X86_64_lib_nsr.so
-rwxrwxr-x 1 jamza jamza       1958 4月  11 13:53 make_image_files.sh
drwxrwxr-x 3 jamza jamza         17 3月  25 10:01 opt
-rw-r--r-- 1 jamza jamza    9055464 3月  25 10:01 tipc.ko
-rwxrwxr-x 1 jamza jamza        927 4月  10 14:05 update_xml_offset.sh

[jamza@A23488809 master]$ ll | awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size}'
[end]size is  1025072090

正則

在awk命令中的正則表達式,包含在符號//之間,如下:

^:行首定位符,如 /^root/ 表示匹配所有以root開頭的行

$:行尾定位符,如 /root$/ 表示匹配所有以root結尾的行

.:匹配任意單個字符,如 /r…t/ 表示匹配字符r,加兩個任意字符,再以t結尾

*:匹配0個或者多個前導字符,如 /a*ool/ 表示匹配0個或者多個a,再加ool,如ool、aaool、aaaaaool等

+:匹配1個或者多個前導字符,如 /a+b/ 表示匹配1個或者多個a,再加b,如ab、aab、aaaab等

?:匹配0個或者1個前導字符,如 /a?b/ 表示匹配b或者ab

[]:匹配指定字符組內的任意一個字符,如 /1/ 表示匹配以字符a或者b或者c開頭的行

[^]:匹配不在指定字符組內任意一個字符,如 /[abc]/ 表示匹配不以字符a或者b或者c開頭的行

():子表達式組合,如 /(root)+/ 表示一個或者多個rool組合,當一些字符需要組合時,使用()即可

|:或,如 /(root) | (jamza)/ 表示匹配root或者jamza的行

\:轉義字符,如 /a/// 表示匹配a//

,!:分別表示匹配,不匹配的條件語句,如 $1~/root/ 表示第一個字段匹配正則表達式/root/的行

x{m}:x重複m次,如 /(root){3}/

x{m,}:x重複至少m次

x{m,n}:x重複至少m次,但不超過n次

正則表達式的應用格式:awk ‘/REG/{action}’ file。例如:

[jamza@A23488809 master]$ awk -F":" '$5~/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

#表示字段5需匹配正則表達式/root/,即包含字符串root

布爾表達式的應用格式:awk ‘布爾表達式{action}’ file。例如

[jamza@A23488809 master]$ awk -F":" '$1=="root"{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[jamza@A23488809 master]$
[jamza@A23488809 master]$ awk -F":" '($1=="root")&&($5=="root") {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

  1. abc ↩︎

發佈了68 篇原創文章 · 獲贊 4 · 訪問量 9153
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章