linux awk入门,awk入门应用
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.178linux.com/62423
總結
以上是生活随笔為你收集整理的linux awk入门,awk入门应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸟哥的linux私房菜有乌班图,折腾Ub
- 下一篇: dbnetlib sqlserver不存