創始人:alfred aho,peter weinberger, 和 brian kernighan
語法:
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)
options常用引數說明:
示例1,單個分隔符:
awk -f, '' test.log #表示使用逗號分割,展示第一列和第二列
示例2,多個分隔符:
$ awk -f '[_,]' '' test.log #先使用下劃線分割,然後對分割結果在使用逗號分隔
示例:設定變數a為1
cat test.log | awk -v a=1 ''
輸出結果:12 13,使用+做數值運算
cat test.log | awk -v a=1 ''
輸出結果:12 12__1,使用雙引號做拼接處理
指令碼基本結構:
awk 'begin pattern end' file
乙個awk指令碼通常由:begin語句塊、能夠使用模式匹配的通用語句塊、end語句塊3部分組成,這三個部分是可選的。任意乙個部分都可以不出現在指令碼中,指令碼通常是被單引號或雙引號中,例如:
awk 'begin end' filename
awk "begin end" filename
工作原理:
awk 'begin pattern end'
!注意:在主體塊部分沒有關鍵字存在,begin 和 end 是 awk 的關鍵字,必須大寫,指令碼中可以沒有開始塊和結束塊。
輸出:使用格式:print item1, item2.....
要點:1、各專案之間使用逗號隔開,而輸出時則以空白字元分隔顯示;
2、輸出的item可以為字串或數值、當前記錄的字段(如$1)、變數或awk的表示式;數值會先轉換為字串,而後再輸出;
3、print命令後面的item可以省略,此時其功能相當於print $0, 因此,如果想輸出空白行,則需要使用print "";
printf format, item1, item2, ...
要點:1、其與print命令的最大不同是,printf需要指定格式;
2、format用於指定後面的每個item的輸出格式;
3、printf語句不會自動列印換行,需要顯式使用\n換行。
format格式的指示符都以%開頭,後跟乙個字元;如下:
%c:顯示字元的ascii碼;
%d, %i:十進位制整數;
%e, %e:科學計數法顯示數值;
%f:顯示浮點數;
%g, %g:以科學計數法的格式或浮點數的格式顯示數值;
%s:顯示字串;
%u:無符號整數;
%%:顯示%自身;
1. 使用格式:
print items > output-file
print items >> output-file
print items | command
2. 特殊檔案描述符:
/dev/stdin:標準輸入
/dev/sdtout: 標準輸出
/dev/stderr: 錯誤輸出
/dev/fd/n: 某特定檔案描述符,如/dev/stdin就相當於/dev/fd/0;
例子:
awk -f: '' /etc/passwd
模式:操作:操作由乙個或多個命令、函式、表示式組成,之間有換行符或分號隔開,並位於大括號內,主要部分是:
條件語句:
迴圈語句:
for (initialisation; condition; increment/decrement)
action
initialisation:初始化區域性變數;
condition:表示式,作為檢查條件;
increment/decrement:變數的遞增或遞減。
示例:$ awk 'begin '
輸出結果:12345
while迴圈先檢查條件是否為真,如果條件為真才執行動作,一直重複到條件為false時結束迴圈。
示例:
$ awk 'begin }'
輸出結果:12345
結束迴圈:內建變數:通常來說,分為兩種型別的內建變數:
- 第一種是定義的變數可以改變, 比如字段分隔(fs)與記錄分隔(rs)
讀取並解析輸入檔案中的每一行,預設按照空格將行內容分隔為字段變數:$1,$2...等,可以是任意的字串或者正規表示式。
語法:$ awk -f 'fs' 'commands' inputfilename 或 $ awk 'begin'
示例:第一步:新建檔案etc_passwd.awk,內容如下所示
begin
end
$ awk -f etc_passwd.awk /etc/passwd
輸出結果(只取部分內容做示例):
_cmiodalassistants 262 262 /var/db/cmiodalassistants
_analyticsd 263 263 /var/db/analyticsd
_fpsd 265 265 /var/db/fpsd
_timed 266 266 /var/db/timed
_reportmemoryexception 269 269 /var/db/reportmemoryexception
108 records processed
- 第二種是可以用來資料處理或者資料總結,比如記錄數(nr)與字段數目(nf)
按指定分隔符分隔字段內容做輸出展示
示例:
$ awk -f':' 'begin ' /etc/passwd
輸出結果(只取部分內容做示例):
71=71
72=72
73=73
74=74
75=75
76=76
陣列:
語法格式:array_name[index]=value
說明:array_name:陣列的名稱
index:陣列索引
value:陣列中元素所賦予的值
linux awk命令學習
awk是一種功能很強大的程式語言,用於linux系統下文字和資料的處理。本篇文章只學習一些awk相關的常規應用,而不對awk的語法進行討論,如果有需要,直接查資料就好了。1.檢視特定程序的pid,sh ps pid tty time cmd 414 00 00 00 rcs 417 00 00 00...
Linux awk學習筆記
今天從linux學習開始,沒有什麼規劃,就簡單記下筆記。f 用來設定處理文字時的域分隔符 預設是空格和tab 例 awk f etc passwd v var 用來設定要傳入指令碼的變數,乙個變數前乙個 v 例 awk v var1 1 v var2 2 etc passwd 正規表示式 限定行 如...
linux awk學習筆記
最近新增了幾個功能的日誌,但是呢,這個日誌就是輸出,一般自己也發現不了問題,於是想寫一些簡單的監控指令碼來看看日誌的大致情況,比如有沒有error,每天有多少error報出來。想到了以前運維的同時分享awk,於是想簡單的學習下。入門最簡單的輸入某些列 使用 4 這種來表示 0 是輸出整列 root ...