awk入門應用

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

(0)
N24-wenxuanN24-wenxuan
上一篇 2016-12-04 11:58
下一篇 2016-12-04 13:48

相關推薦

  • bash腳本之for循環和while循環及包管理

    一.概述 上一章剩余內容 壓縮工具 cpio 復制從或到文件 cpio命令是通過重定向的方式將文件進行打包備份,還原恢復的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件。 cpio[選項] > 文件名或者設備名 cpio[選項] < 文件名或者設備名 選項 -o 將文件拷貝打包成文件或者將文件輸出到設備上 -i解包,將打包文件解壓或將…

    Linux干貨 2016-08-24
  • Linux下的find命令詳解

    Linux下的find命令詳解 在linux下有兩種查找符合條件文件的命令,是locate和find。我們來說說find這個命令。 find: 實時查找工具,遍歷查找指定路徑下的所有的文件來找到符合條件的文件。 特點:查找文件比locate速度略慢,查找文件很精確,并且是實時進行查找的。 使用方法:find [OPTIONS] [查找起始路徑] [查找條件]…

    Linux干貨 2018-03-20
  • Linux磁盤和文件系統管理

    磁盤相關概念 設備類型: 塊設備(block):存取單位為塊,典型設備磁盤 字符設備(char):存取單位為字符,典型設備為鍵盤 設備文件: 關聯至一個設備驅動程序,進而能夠跟與之對應硬件設備進行通信。 如果存在兩個相同型號設備,使用兩個設備文件,但可能還會關聯到同一個驅動程序 設備文件只有元數據即屬性,沒有數據內容,屬于特殊文件類型 設備號碼: 主設備號:…

    Linux干貨 2016-06-09
  • 通過webGUI顯示日志信息

         日志信息通常對于我們維護人員有著極為重要的意義,能夠為我們提供故障排查、運維監控、歷史操作記錄等等很多必要的信息。為了方便此類信息的獲取,我們可以搭建日志服務器,并實現webGUI顯示以便更直觀形象的觀察收集它們。     一、拓撲圖         &nbs…

    Linux干貨 2015-07-15
  • bash特性之命令行展開功能應用示例

                       bash特性之命令行展開功能應用示例 1.創建/tmp的目錄下:a_c,a_d,b_c,b_d 創建命令:mkdir -pv /tmp/{a,…

    Linux干貨 2017-07-09
  • 馬哥教育網絡班22期+第13周課程練習

    1、建立samba共享,共享目錄為/data,要求:(描述完整的過程)   1)共享名為shared,工作組為magedu;   2)添加組develop,添加用戶gentoo,centos和ubuntu,其中gentoo和centos以develop為附加組,ubuntu不屬于develop組;密碼均為用戶名; &n…

    Linux干貨 2016-12-05
欧美性久久久久