awk概述
使用語法
常用命令選項
相關輸出命令
print item1,item2,…
printf FORMAT,item1,item2,….
相關格式符
相關修飾符
相關內建變量
相關內置函數
相關操作符
相關模式
相關控制語句及示例
if(condition) statements
if(condition){statements} else {statements}
while (condition){statements}
for(expr1;expr2;expr3){statements}
相關擴展 針對與使用awk統計網站訪問相關
統計訪問頻次最高的5個ip
統計惡意ip
找出訪問最多的文件(下載類網站常用,這里以.exe擴展名舉例)
統計該網站的流量,統計結果以“G“”顯示
查看日志中出現100次以上的IP
查看某一IP在網站內都訪問了哪些資源
awk概述
awk是一種編程語言,用于在linux/unix下對文本和數據進行處理。數據可以來自標準輸入、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更多是作為腳本來使用。awk的處理文本和數據的方式是這樣的,它逐行掃描文件,從第一行到最后一行,尋找匹配的特定模式的行,并在這些行上進行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標準輸出(屏幕),如果沒有指定模式,則所有被操作所指定的行都被處理。awk分別代表其作者姓氏的第一個字母。因為它的作者是三個人,分別是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell實驗室和GNU的一些擴展。下面介紹的awk是以GUN的gawk為例的,在linux系統中已把awk鏈接到gawk,所以下面全部以awk進行介紹。
使用語法
awk [ -F Ere ] [ -v Assignment ] … { -f ProgramFile | 'Program' } [ [ File … | Assignment … ] ] …
常用命令選項
-F fs or --field-separator fs
指定輸入文件折分隔符,fs是一個字符串或者是一個正則表達式,如-F:。-v var=value or --asign var=value
賦值一個用戶定義變量。-f scripfile or --file scriptfile
從腳本文件中讀取awk命令。
相關輸出命令
print item1,item2,…
要點:
逗號
作為item的分隔符
輸出的item可是字符串
,也可以是數值
:當前記錄的字段、變量或awk的表達式
如省略item,相當于print $0
printf FORMAT,item1,item2,….
要點:
FORMAT
是必須要給出的
不會自動換行,需要顯示給出換行控制符\n
FORMAT中需要分別
為后面的每個item指定一個格式化符號
相關格式符
格式符 | 描述 |
---|---|
%c | 顯示字符的ASCII碼 |
%d,%i | 顯示十進制整數 |
%e,%E | 科學計數法數值顯示 |
%f | 顯示為浮點數 |
%g,%G | 以科學計數法或浮點形式顯示數值 |
%s | 顯示字符串 |
%u | 無符號整數 |
%% | 顯示%自身 |
相關修飾符
修飾符 | 描述 |
---|---|
m[.n] | m表示控制顯示的寬度,默認右對齊;n表示小數點后的精度 |
– | 左對齊 |
+ | 顯示數值的符號 |
相關內建變量
變量名 | 描述 |
---|---|
FS | input field seperator ,指定輸入分隔符,默認為空白字符 |
OFS | output field seperator,指定輸出分隔符,默認為空白字符 |
RS | input record seperator,指定輸入行分隔符 |
ORS | output record seperator,指定輸出行分隔符 |
NF | number of field,字段數量 |
{print NF} | 打印統計的字段數量 |
{print $NF} | 打印每行的最后一字段 |
NR | number of record,行數 |
FNR | 多文件統計,各文件分別計數,顯示行數 |
FILENAME | 當前文件名 |
ARGC | 命令行參數的個數 |
ARGV | 命令行中給定的各參數 |
相關內置函數
函數表達式 | 描述 |
---|---|
rand() | 返回0-1之間的隨機數,小數 |
length([$]) | 返回指定字符串的長度 |
sub(r,s,[t]) | 以r表示的模式來查找t所表示的字符串中的匹配的內容,并將其第一次出現替換為s所表示的內容 |
gsub(r,s,[t]) | 以r表示的模式來查找t所表示的字符串中的匹配的內容,并將其所有出現全部替換為s所表示的內容 |
split(s,a[,r]) | 以r為分隔符切割字符s,并將切割后的結果保存在a所表示的數組中 |
相關操作符
運算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 賦值 |
?: | C條件表達式 |
|| | 邏輯或 |
&& | 邏輯與 |
~ | 匹配正則表達式 |
~! | 不匹配正則表達式 |
< <= > >= != == | 關系運算符 |
空格 | 連接 |
+ – | 加,減 |
* / & | 乘,除與求余 |
+ – ! | 一元加,減和邏輯非 |
^ *** | 求冪 |
++ – | 增加或減少,作為前綴或后綴 |
$ | 字段引用 |
in | 數組成員 |
相關模式
模式 | 描述 |
---|---|
empty | 空模式,匹配每一行 |
BEGIN{} | 僅在開始處理文件中的文本之前執行一次 |
END{} | 僅在文本處理完成之后執行一次 |
/regular expression/ | 僅處理能夠被此處模式匹配到的行 |
relational expression | 關系表達式,結果有"真"有"假",結果為"真"才會被處理,真:結果為非0值,非空字符串 |
line ranges | 行范圍,startline,endline:/pat1/,/pat2/或(NR>=startline&&NR<=endline) |
相關控制語句及示例
if(condition) statements
找出系統上UID大于等于1000的用戶,并將用戶輸出形式類似于“Conmon user: gwx”
awk -F: '{if ($3>=1000) printf "Common user: %s\n",$1}' /etc/passwd
找出系統上默認shell為/bin/bash的用戶,并輸出該用戶的用戶名
awk -F: '{if ($NF == "/bin/bash")print $1}' /etc/passwd
找出系統上默認shell為bash的用戶,并輸出該用戶的用戶名
awk -F: '{if ($NF~"bash$")print $1}' /etc/passwd
輸出當前系統上fstab掛載的設備情況
awk '{if ($1!="#")print $0}' /etc/fstab
輸出當前系統使用比例超過80%的分區
df -h |awk -F% '/\/dev/{print $1}'|awk '{if ($NF>80)print $1}'
if(condition){statements} else {statements}
找出系統上UID大于等于1000的用戶,并將用戶輸出形式類似于“Conmon user: gwx”,其余用戶輸出形式類似于“Sysuser:php”
awk -F: '{if ($3>=1000) {printf "Common user: %s\n",$1} else {printf "Sysuser: %s\n",$1}}' /etc/passwd
while (condition){statements}
輸出當前系統/etc/grub2.cfg文件中以linux16開頭的行的字符數大于等于7個的字段,并在字段的后面顯示該字段的字符數
awk '/^[[:space:]]*linux16/{i=1;while (i<=NF){if (length($i)>=7){print $i,length($i)};i++}}' /etc/grub2.cfg
for(expr1;expr2;expr3){statements}
輸出當前系統/etc/grub2.cfg文件中以linux16開頭的行字段,并在字段的后面顯示該字段的字符數
awk '/^[[:space:]]*linux16/{for (i=1;i<=NF;i++){print $i,length($i)}}' /etc/grub2.cfg
相關擴展 針對與使用awk統計網站訪問相關
日志字段定義樣例如下,如果日志文件做了輪替設置,請查看對應要統計的日志文件做統計分析
10.6.9.15 – – [12/Nov/2016:16:24:15 +0800] "GET / HTTP/1.1" 200 258 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36"
統計訪問頻次最高的5個ip
cat /var/log/httpd/access_log |awk '{print $1}'|sort|uniq -c|sort -nr|head -5
統計惡意ip
cat /var/log/httpd/access_log|awk '{if($9~/40/){print $1}}'|sort|uniq|sort -nr
找出訪問最多的文件(下載類網站常用,這里以.exe擴展名舉例)
cat /var/log/httpd/access_log|awk '($7 ~/.exe/){print $10 "" $1 "" $4""$7}' |sort -n |uniq -c |sort -nr |head -10
統計該網站的流量,統計結果以“G“”顯示
cat /var/log/httpd/access_log|awk '{sum+=$10} END {print sum/1024/1024/1024"G"}'
查看日志中出現100次以上的IP
cat /var/log/httpd/access_log-20161113|cut -d ' ' -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}'
查看某一IP在網站內都訪問了哪些資源
cat /var/log/httpd/access_log-20161113| grep 10.6.9.15| awk '{print $1"\t"$7}' | sort | uniq -c | sort -nr | less
原創文章,作者:N24-wenxuan,如若轉載,請注明出處:http://www.www58058.com/62423