awk 分析檔案
1,預設每行按空格或TAB分割,輸出文本中的1、4項 awk '{print $1,$4}' log.txt
2,指定分割字元‘逗號’,輸出文本中的1、4項 awk -F, '{print $1,$4}' log.txt
3,設定變數 awk -va=1 '{print $1,$1+a}' log.txt; awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
4,運算,
| 運算子 |
描述 |
| = += -= *= /= %= ^= **= |
賦值 |
| ?: |
C條件運算式 |
| || |
邏輯或 |
| && |
邏輯與 |
| ~ ~! |
匹配Regex和不匹配Regex |
| < <= > >= != == |
關係運算子 過濾第一列大於2的行 awk '$1>2' log.txt ; 過濾第一列大於2且第二列等於'Are'的行 awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt |
| 空格 |
串連 |
| + - |
加,減 |
| * / & |
乘,除與求餘 |
| + - ! |
一元加,減和邏輯非 |
| ^ *** |
求冪 |
| ++ -- |
增加或減少,作為首碼或尾碼 |
| $ |
欄位引用 |
| in |
數群組成員 |
5,內建變數
| 變數 |
描述 |
| \$n |
目前記錄的第n個欄位,欄位間由FS分隔 |
| \$0 |
完整的輸入記錄 |
| ARGC |
命令列參數的數目 |
| ARGIND |
命令列中當前檔案的位置(從0開始算) |
| ARGV |
包含命令列參數的數組 |
| CONVFMT |
數字轉換格式(預設值為%.6g)ENVIRON環境變數關聯陣列 |
| ERRNO |
最後一個系統錯誤的描述 |
| FIELDWIDTHS |
欄位寬度列表(用空格鍵分隔) |
| FILENAME |
當前檔案名稱 |
| FNR |
同NR,但相對於當前檔案 |
| FS |
欄位分隔符號(預設是任何空格) |
| IGNORECASE |
如果為真,則進行忽略大小寫匹配 |
| NF |
目前記錄中的欄位數 awk '{print NF,$1,$2,$3}' log.txt |
| NR |
目前記錄數 |
| OFMT |
數位輸出格式(預設值是%.6g) |
| OFS |
輸出欄位分隔符號(預設值是一個空格) |
| ORS |
輸出記錄分隔字元(預設值是一個分行符號) |
| RLENGTH |
由match函數所匹配的字串的長度 |
| RS |
記錄分隔字元(預設是一個分行符號) |
| RSTART |
由match函數所匹配的字串的第一個位置 |
| SUBSEP |
數組下標分隔字元(預設值是/034) |
6,使用Regex
輸出包含"re" 的行 awk '/re/ ' log.txt ~ 表示模式開始。// 中是模式
輸出第二列包含 "th",並列印第二列與第四列 awk '$2 ~ /th/ {print $2,$4}' log.txt
忽略大小寫 awk 'BEGIN{IGNORECASE=1} /this/' log.txt
sed 's/hi/HI/'替換hi為HI
sort file.txt | uniq -c統計各行在檔案中出現的次數
-n是按照數字大小排序,-r是以相反順序,-k是指定需要愛排序的欄位,-t指定欄位分隔字元為冒號
zgrep "run time:" test.log.gz
|awk '{print $(NF-3),$(NF-1)}'
|sed 's/QT-[0-9]\{10,20\}//'
|sed 's/pool-[0-9]\{1,3\}-thread-[0-9]\{1,3\}//'
|sort
|uniq -c
|sed 's/time://'
|sort -k 3n
|sed 's/:method://'
|awk '{{if($NF<=5) {a[$2" 5"] += $1;} else if($NF<=10) {a[$2 " 10"] += $1;}
else if($NF<=20) {a[$2" 20"] += $1;} else if($NF<=30) {a[$2" 30"] += $1;}
else if($NF<=40) {a[$2" 40"] += $1;} else if($NF<=50) {a[$2" 50"] += $1;}
else if($NF<=60) {a[$2" 60"] += $1;} else {a[$2" 61+"] += $1}} cs[$2] += $1;}
END{ for( i in a)
{print i, a[i],a[i]/cs[substr(i,0,index(i," ")-1)] }}'
|sort -k 1,1r -n -k 2
|awk '{print $1"\t"$2"\t"$3"\t"$4}' >~/all-htime2.txt