本文為joshua317原創文章,轉載請注明:轉載自joshua317博客 https://www.joshua317.com/article/151
一天一個 Linux 命令(21):awk 命令
一、簡介
awk是一個強大的文本分析工具,簡單來說awk就是把文件逐行讀入,(空格,制表符)為默認分隔符將每行切片,切開的部分再進行各種分析處理;
awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程序設計語言 , 三位創建者已將它正式定義為“樣式掃描和處理語言”。它允許創建簡短的程序,這些程序讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。
相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。
二、格式說明
awk [POSIX or GNU style options] -f progfile [--] file ...
awk [POSIX or GNU style options] [--] 'program' file ...
awk '{pattern + action}' {file}
awk [選項參數] 'script' var=value file(s)
awk [選項參數] -f scriptfile var=value file(s)
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options: GNU long options: (standard)
-f progfile --file=progfile
-F fs --field-separator=fs
-v var=val --assign=var=val
Short options: GNU long options: (extensions)
-b --characters-as-bytes
-c --traditional
-C --copyright
-d[file] --dump-variables[=file]
-e 'program-text' --source='program-text'
-E file --exec=file
-g --gen-pot
-h --help
-L [fatal] --lint[=fatal]
-n --non-decimal-data
-N --use-lc-numeric
-O --optimize
-p[file] --profile[=file]
-P --posix
-r --re-interval
-S --sandbox
-t --lint-old
-V --version
To report bugs, see node `Bugs' in `gawk.info', which is
section `Reporting Problems and Bugs' in the printed version.
gawk is a pattern scanning and processing language.
By default it reads standard input and writes standard output.
Examples:
gawk '{ sum += $1 }; END { print sum }' file
gawk -F: '{ print $1 }' /etc/passwd
awk語言的最基本功能是在文件或者字符串中基於指定規則瀏覽和抽取信息,awk抽取信息后,才能進行其他文本操作。完整的awk腳本通常用來格式化文本文件中的信息。
通常,awk是以文件的一行為處理單位的。awk每接收文件的一行,然后執行相應的命令,來處理文本。
三、選項說明
-f progfile,--file=progfile 從文件progfile中讀取AWK程序源代碼,而不是從第一個命令行參數中讀取。
可以使用多個-f(或——file)選項。
-F fs,--field-separator=fs 使用fs作為輸入字段分隔符(fs預定義變量的值)。
-v var=val,--assign=var=val 在程序開始執行之前,給變量var賦值val。這樣的變量值是AWK程序的BEGIN塊可用。
-b,--characters-as-bytes 將所有輸入數據視為單字節字符。換句話說,當試圖將字符串處理為多字節字符時,不要注意任何語言環境信息。
-c,--traditional 在兼容性模式下運行。在兼容模式下,gawk的行為與UNIX awk相同;沒有一個GNU可以識別特定的擴展。
-C,--copyright 在標准輸出上打印GNU版權信息的簡短版本並成功退出。
-d[file,--dump-variables[=file] 打印一個排序的全局變量列表,它們的類型和最終值到文件
-e 'program-text',--source='program-text' 使用程序文本作為AWK程序源代碼
-E file,--exec=file,與-f類似,這個選項是最后處理的選項
-g,--gen-pot 掃描並解析AWK程序,並在標准輸出上生成一個GNU .pot(可移植對象模板)格式文件,其中包含程序中所有可本地化字符串的條目
-h,--help
-L [fatal],--lint[=fatal] 對可疑的或不可移植到其他AWK實現的構造提供警告
-n,--non-decimal-data 識別輸入數據中的八進制和十六進制值
-N,--use-lc-numeric 迫使gawk在解析輸入數據時使用語言環境的小數點字符
-O,--optimize 啟用優化程序的內部表示
-p[file],--profile[=file] 發送分析數據到profile
-P,--posix 打開兼容性模式
-r,--re-interval 在正則表達式匹配中啟用間隔表達式
-S,--sandbox 在沙箱模式下運行gawk
-t,--lint-old 提供關於不能移植到Unix awk原始版本的構造的警告
-V,--version 在標准輸出上打印gawk的這個特定副本的版本信息
四、命令功能
一次讀取一行文本,按輸入分隔符進行切片,切成多個組成部分,將每片直接保存在內建的變量中,$1,$2,$3....,引用指定的變量,可以顯示指定斷,或者多個斷。如果需要顯示全部的,需要使用$0來引用。可以對單個片斷進行判斷,也可以對所有斷進行循環判斷。其默認分隔符為空格
五、調用awk的三種方式
5.1 命令行方式
awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。
在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。
5.2 shell腳本方式
將所有的awk命令插入一個文件,並使awk程序可執行,然后awk命令解釋器作為腳本的首行,一遍通過鍵入腳本名稱來調用。
相當於shell腳本首行的:#!/bin/sh
可以換成:#!/bin/awk
5.3 將所有的awk命令插入一個單獨文件,然后調用
awk -f awk-script-file input-file(s)
其中,-f選項加載awk-script-file中的awk腳本,input-file(s)跟上面的是一樣的。
六、awk操作符
6.1 算術操作符
-x : 負值
+x : 轉換為數值
x^y :
x**y : 次方
x*y : 乘法
x/y : 除法
x+y : 加法
x-y : 減法
x%y : 取模
6.2 字符串操作符
只有一個,而且不用寫出來,用於實現字符串連接
6.3 賦值操作符
=
+=
-=
*=
/=
%=
^=
**=
++
--
需要注意的是,如果某模式為=
號,此時使用/=/可能會有語法錯誤,就以/[=]/
替代
6.4 布爾值
awk中,任何非0值或非空字符串都為真,反之為假
6.5 比較操作符
x<y
x<=y
x>y
x>=y
x==y
x!=y
x~y
x!~y
6.6 邏輯操作符
&&
||
!
6.7 函數調用
func_name(argu1,argu2,....)
6.8 條件表達式
selector?if-true-expression:if-false-expression
#example:
awk -F: '{$3>=1000?usertype="Common user":usertype="Sysadmin or sysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd
七、變量
7.1 內置變量
變量 | 描述 |
---|---|
$n | 當前記錄的第n個字段,字段間由FS分隔 |
$0 | 完整的輸入記錄 |
ARGC | 命令行參數的數目 |
ARGIND | 命令行中當前文件的位置(從0開始算) |
ARGV | 包含命令行參數的數組 |
CONVFMT | 數字轉換格式(默認值為%.6g)ENVIRON環境變量關聯數組 |
ERRNO | 最后一個系統錯誤的描述 |
FIELDWIDTHS | 字段寬度列表(用空格鍵分隔) |
FILENAME | 當前文件名 |
FNR | 各文件分別計數的行號 |
FS | 字段分隔符(默認是任何空格) |
IGNORECASE | 如果為真,則進行忽略大小寫的匹配 |
NF | 一條記錄的字段的數目 |
NR | 已經讀出的記錄數,就是行號,從1開始 |
OFMT | 數字的輸出格式(默認值是%.6g) |
OFS | 輸出字段分隔符,默認值與輸入字段分隔符一致。 |
ORS | 輸出記錄分隔符(默認值是一個換行符) |
RLENGTH | 由match函數所匹配的字符串的長度 |
RS | 記錄分隔符(默認是一個換行符) |
RSTART | 由match函數所匹配的字符串的第一個位置 |
SUBSEP | 數組下標分隔符(默認值是/034) |
FS: input field seperator,輸入的分隔符,默認為空格
OFS: output field seperator,輸出的分隔符,默認為空格
RS: input record seperator,輸入的換行符
ORS: output record seperator,輸出時的換行符
NF: number of field ,字段個數
#example:
awk '{print NF}' /etc/passwd :打印每行的最后一個字段為第幾個字段,這里是數量引用,不是對應的值引用
awk '{print $NF}' /etc/passwd : 打印每行中的最后一個字段
NR: number of record,文件中的行數
#example:
awk '{print NR}' /etc/passwd: 打印行號,其會個行號都顯示
awk 'END{print NR}' /etc/passwd: 顯示文本的總行數,其只是在文本處理完成后,只顯示一次行號
awk '{print NR}' file1 file2 : 會每把所有文檔進行總的編號,而不是單獨對文件進行編號
FNR: 對每個文件進行行數單獨編號
#example:
awk '{print FNR}' file1 file2 : 會對每個文件的行數進行單獨的編號顯示
FILENAME : awk命令所處理的文件的名稱
#example:
awk '{print FILENAME}' file1 : 顯示當前文件名,但會每行顯示一次
awk 'END{print FILENAME}' file1 : 顯示當前文件名,但只會顯示一次
ARGC: 命令行中參數的個數,其awk命令也算一個參數
#example:
awk 'END{print ARGC}' /etc/passwd : 顯示共有幾個參數
ARGV : 其是一個數組,保存的是命令行所給定的各參數
#example:
awk 'END{print ARGV[0]}' /etc/passwd : 顯示第一個參數,默認第一個參數個awk命令本身
7.2 自定義變量
-v var=VALUE : 在選項位置定義
#example:
#變量在program中定義時,需要使用引號引起來
awk 'BEGIN{test="hello";print test}' : 在program中定義
八、print和printf
awk中同時提供了print和printf兩種打印輸出的函數。
其中print函數的參數可以是變量、數值或者字符串。字符串必須用雙引號引用,參數用逗號分隔。如果沒有逗號,參數就串聯在一起而無法區分。這里,逗號的作用與輸出文件的分隔符的作用是一樣的,只是后者是空格而已。
printf函數,其用法和c語言中printf基本相似,可以格式化字符串,輸出復雜時,printf更加好用,代碼更易懂。
8.1 區別
print
1、各項目之間使用逗號隔開,而輸出時則以空白字符分隔
2、輸出的item可以為字符串或數值,當前記錄的字段(如$1)、變量或awk的表達式,數值會先轉換為字符串,而后再輸出
3、print命令后面的item可以省略,此時其功能相當於print $0,因此,如果想輸出空白行,則需要使用print""
4、如果引用變量$1或其他的,是不能使用引號引起來
printf
1、其與print命令最大不同是,printf需要指定format
2、printf后面的字串定義內容需要使用雙引號引起來
3、字串定義后的內容需要使用","分隔,后面直接跟item1,item2....
4、format用於指定后面的每個item的輸出格式
5、printf語句不會自動打印換行符,\n
8.2 格式符
%c: 顯示字符的ASCII碼
%d,%i : 顯示十進制整數
%e,%E: 科學計數法數值顯示
%f : 顯示為浮點數
%g,%G: 以科學數法或浮點形式顯示數值
%s: 顯示字符串
%u: 無符號整數
%%: 顯示%號自身,相當於轉義
8.3 修飾符
N: 顯示寬度
-: 左對齊(默認為右對齊)
+: 顯示數值符號
#example:
awk -F: '{printf "%s\n",$1}' /etc/passwd
awk -F: '{printf "username: %s,UID:%d\n",$1,$3}' /etc/passwd
awk -F: '{printf "username: %-20s shell: %s\n",$1,$NF}' /etc/passwd
8.4 輸出重定向
print items > "output-file"
print items >> "output-file"
print items | command
特殊文件描述符:
/dev/stdin :標准輸入
/dev/stdout:標准輸出
/dev/stderr:錯誤輸出
/dev/fd/N : 某特定文件描述符,如/dev/stdin就相當於/dev/fd/0
#example:
awk -F: '{printf "%-15s %i\n",$1,$3 > "/dev/stderr"}' /etc/passwd
九、PATTERN的使用
awk [option] 'PATTERN{action}' file1,file2....
1.REGEXP:正則表達式,格式為/regular expression/,僅處理能夠被此處模式匹配到的行
#example:
awk '/^root/{print $1}' /etc/passwd
awk '!/^root/{print $1}' /etc/passwd
relational expression:表達式,其值非0或為非空字符時滿足條件,用運算符~(匹配)和!~(不匹配)
$1 ~ /foo/ 或者 $1 == "magedu"
2.Ranges : 指定匹配范圍,格式為/pat1/,/pat2/
#example:
awk -F: '(NR>=2&&NR<=10) {print $1}' /etc/passwd
awk -F: '/^root/,/^myuser/{print $1}' /etc/passwd
注意:不支持直接給出數字的格式
3.EGIN/END模式 : 特殊模式,僅在awk命令執行前運行一次或結束前運行一次
#example:
#先打印一個表頭
awk -F: 'BEGIN{print "Username ID Shell"}{printf "%-10s%-10s%-20s\n",$1,$3,$7}' /etc/passwd
#打印一個表尾
awk -F: 'BEGIN{print "username ID Shell"}{printf "%-10s%-10s%-20s\n",$1,$3,$7}END{print "end of report."}' /etc/passwd
4.Empty(空模式):匹配任意輸入行
/正則表達式/:使用通配符的擴展集。
關系表達式:可以用下面運算符表中的關系運算符進行操作,可以是字符串或數字的比較,如$2>$1選擇第二個字段比第一個字段長的行。
模式匹配表達式:
模式,模式:指定一個行的范圍。該語法不能包括BEGIN和END模式。
BEGIN:讓用戶指定在第一條輸入記錄被處理之前所發生的動作,通常可在這里設置全局變量。
END:讓用戶在最后一條輸入記錄被讀取之后發生的動作。
十、控制語句
10.1 if-else
if (condition){then-body} else{[else-body]}
#example:
awk -F: '{if($3>=1000)print $1,$3,$7}' /etc/passwd
awk -F: '{if($3>=1000){printf "Common user: %s\n",$1} else {printf "root or sysuser: %s\n",$1}}' /etc/passwd
awk -F: '{if($NF=="/bin/bash")print $1}' /etc/passwd
awk -F: '{if(NF>=7) print $0}' /etc/passwd
#有問題
df -h | awk -F[%] '/^/dev/{print $1}' | awk {if($NF>=20) print $1}'
awk -F: '{if($1=="root") print $1,"Admin";else print $1, "Common User"}' /etc/passwd
awk -F: '{if($1=="root") printf "%-15s: %s\n",$1,"Admin";else printf "%-15s: %s\n",$1, "Common user"}' /etc/passwd
#統計用戶ID大於500的有多少行
awk -F: -v sum=0 '{if($3>=500) sum++}END{print sum}' /etc/passwd
#可以使用\t制表符控制 輸出格式
awk -F: -v OFS="\t" '{if($3<=999)printf "Sys user:\t%-15s ID is :%d\n", $1,$3;else{printf "Common user:\t%-15s ID is :%d\n",$1,$3}}' /etc/passwd
10.2 while:用於循環
while (condition){statement1;statment2;....}
#example:
awk '/^[[:space:]]*linux16/{print}' /boot/grub2/grub.cfg
#對每個字段進行字符個數統計
awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grub2.cfg
awk '/^[[:space:]]]*linux16/{i=1;while(i<=NF){if(length($i)<=7)print $i,length($i);i++}}' /etc/grub2.cfg
#打印用戶名、密碼占位符、ID
awk -F: '{i=1;while(i<=3){print $i;i++}}' /etc/passwd
#字段大小大於等於4的都顯示
awk -F: '{i=1;while(i<=NF){if(length($i)>=4){print $i};i++}}' /etc/passwd
10.3 do-while
do {statement1,statement2,....} while (dondition)
#example:
#打印用戶名、密碼占位符、UID
awk -F: '{i=1;do{print $i;i++}while(i<=3)}' /etc/passwd
10.4 for
for(variable assignment;condition;iteration process){ statement1,statement2,...}
#example:
awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
awk -F: '{for(i=1;i<=3;i++)print $i}' /etc/passwd
awk -F: '{for(i=1;i<=NF;i++) { if (length($i)>=4) {print $i}}}' /etc/passwd
10.5 for循環還可以用來遍歷數組元素
for (i in array) {statement1,statement2,....}
#example:
awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%15s:%i\n",A,BASH[A]}}' /etc/passwd
awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
#統計/etc/fstab中各文件系統的次數
awk '/^UUID/{filesystem[$3]++}END{for (i in filesystem) {print i,filesystem[i]}}' /etc/fstab
#統計各連接狀態的次數
netstat -ant | awk '/^tcp/{state[$NF]++}END{for(i in state) {print i,state[i]}}'
#統計訪問日志中各IP的訪問次數
awk '{ip[$1]++} END {for (i in ip) {print i,ip[i]}}' /data/log/nginx/access.log
10.6 case
switch (expression) { case VALUE or /REGEXP/: statement1, statement2,... default: statement1, ...}
10.7 break和continue
break [n]
continue : 進入下一個字段
10.8 next
#功能:提前結束本行文本的處理,並接着處理下一行
#example:
awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd
awk -F: '{if($3%2!=0) next;print $1,$3}' /etc/passwd
十一、awk的數組
11.1 定義數組
1、可使用任意字符串,字符串要使用雙引號
2、如果某數組元素事先不存在,在引用時awk會自動創建此元素,並將其初始化為空串
3、要遍歷數組中的每個元素,要使用for循環
for(var in array){statement1,.....}
# 注意:var用於引用數組時,是引用的下標,而不是元素值
11.2 定義數組的格式
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}'
統計netstat -ant中各狀態的次數
#每出現一被/^tcp/模式匹配到的行,數組S[$NF]就加1,NF為當前匹配到的行的最后一個字段,此處用其值做為數組S的元素索引
netstat - | awk '/^tcp/{state[$NF]++}END{for(i in state) {print i,state[i]}}'
#統計www服務的訪問日志中IP數量
awk '{ip[$1]++} END {for (i in ip) {print i,ip[i]}}' /data/log/nginx/access.log
#統計/etc/fstab文件中每個文件系統類型出現的次數
awk '/^UUID/{filesystem[$3]++}END{for (i in filesystem) {print i,filesystem[i]}}' /etc/fstab
#統計指定文件中單詞的出現次數
awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
#統計出/etc/passwd文件中shell的種類和個數
awk -F: '{shell[$NF]++}END{for(A in shell){print A,shell[A]}}' /etc/passwd
重點解析一下這條命令:
首先,shell[$NF]++這個語句。其中的$NF所代表的是一個字符串,即shell的類型。也就是說在這個數組中的元素名稱是shell的名稱。而后面的++是對這個數組進行賦值。因為在/etc/passwd 這個文件中的shell類型只有兩種,即/bin/bash和/sbin/nologin。也就是說這個數組就只有兩個元素,並且它的值是不斷被更新的。其次,語句for(A in shell)是設定了A是數組shell中的坐標變量,即是A是元素的名稱,shell[A]是數組的值。
十二、awk的內置函數
1.split(string, array [, fieldsep [, seps ] ])
功能:將string表示的字符串以fieldsep為分隔符進行分隔,並將分隔后的結果保存至array為名的數組中;數組下標為從0開始的序列;
#example:
netstat -ant | awk '/^tcp/{split($5,ip,":");count[ip[1]]++}END{for(i in count)print i,count[i]}'
netstat -ant | awk '/:443/{split($5,clients,":");IP[clients[1]]++}END{for(i in IP){print IP[i],i}}' | sort -rn | head -50
2.ength([string])
功能:返回string字串中字符的個數
3.substr(string, start [, length])
功能:取string字符串中的子串,從start開始,取length個;start從1開始計數
4.system(command)
功能:執行系統command並將結果返回至awk命令
5.systime()
功能:取系統當前時間
6.tolower(s)
功能:將s中的所有字母轉為小寫
7.toupper(s)
功能:將s中的所有字母轉為大寫
十三、常見用法匯總
13.1 系統連接狀態
1.查看TCP連接狀態
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
netstat -n | awk '/^tcp/ {++state[$NF]};END {for(i in state) print i, state[i]}'
netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(i in state) print i,"\t",state[i]}'
netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn
netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c
2.查找請求數前20個IP(常用於查找攻來源):
netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20
3.用tcpdump嗅探80端口的訪問看看誰最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20
4.查找較多time_wait連接
netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20
5.找查較多的SYN連接
netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more
6.根據端口列進程
netstat -ntlp | grep 80 | awk '{print $7}' | cut -d/ -f1
netstat -tnlp | awk '/22/{split($NF,port,"/");d[port[1]]++}END{for(i in d)print i}'
13.2 網站日志分析
1.獲得訪問前10位的ip地址
cat /data/log/nginx/access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10
cat /data/log/nginx/access.log|awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}'
2.訪問次數最多的文件或頁面,取前20
cat /data/log/nginx/access.log|awk '{print $11}'|sort|uniq -c|sort -nr|head -20
3.列出傳輸最大的幾個exe文件(分析下載站的時候常用)
cat /data/log/nginx/access.log |awk '($7~/.exe/){print $10 " " $1 " " $4 " " $7}'|sort -nr|head -20
4.列出輸出大於200000byte(約200kb)的exe文件以及對應文件發生次數
cat /data/log/nginx/access.log |awk '($10 > 200000 && $7~/.exe/){print $7}'|sort -n|uniq -c|sort -nr|head -100
5.如果日志最后一列記錄的是頁面文件傳輸時間,則有列出到客戶端最耗時的頁面
cat /data/log/nginx/access.log |awk '($7~/.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -100
6.列出最最耗時的頁面(超過60秒的)的以及對應頁面發生次數
cat /data/log/nginx/access.log |awk '($NF > 60 && $7~/.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100
7.列出傳輸時間超過 30 秒的文件
cat access.log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20
8.統計網站流量(G)
cat /data/log/nginx/access.log |awk '{sum+=$10} END {print sum/1024/1024/1024}'
9.統計404的連接
awk '($9 ~/404/)' /data/log/nginx/access.log | awk '{print $9,$7}' | sort
10. 統計http status
cat /data/log/nginx/access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}'
cat /data/log/nginx/access.log |awk '{print $9}'|sort|uniq -c|sort -rn
10.蜘蛛分析,查看是哪些蜘蛛在抓取內容。
/usr/sbin/tcpdump -i eth0 -l -s 0 -w - dst port 80 | strings | grep -i user-agent | grep -i -E 'bot|crawler|slurp|spider'
13.3 數據庫
/usr/sbin/tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | egrep -i 'SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL'
13.4 系統Debug分析
1.調試命令
strace -p pid
2.跟蹤指定進程的PID
gdb -p pid
13.5 其他
#統計某個文件夾下的文件占用的字節數
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
#如果以M為單位顯示
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}'
注意,統計不包括文件夾的子目錄。
#統計某個文件夾下的文件占用的字節數,過濾4096大小的文件(一般都是文件夾)
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'
#顯示/etc/passwd的賬戶
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i in name) {print i,name[i]}}' /etc/passwd
#AWK 的 hello world 程序為:
BEGIN { print "Hello, world!" }
#打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
#results
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
歡迎留言,持續匯總。。。
本文為joshua317原創文章,轉載請注明:轉載自joshua317博客 https://www.joshua317.com/article/151