正則表達式 基本正則 ^ $ [abc] [^] . * \{n,m\} \{n\} \{n,\} \(\) 擴展正則+ ? {n,m} a|b|c () \b
前置命令 | sed 選項 (定址符)指令 sed 選項 (定址符)指令 被處理的文檔 選項 : -n -r -i 指令: p d s
==============================
a行下添加 i行上添加 c替換整行正則表達式
#!/bin/bash n=`sed -n '/bash$/s/:.*//p' /etc/passwd` for i in $n 將找到的使用bash的用戶名交給for循環 do p=`grep $i: /etc/shadow` 將名字與shadow對比 p1=${p#*:} 找到對應的行,掐頭 p2=${p1%%:*} 去尾,獲得純粹的密碼 echo "$i --> $p2" 輸出最後結果 done
用法: awk 選項 (條件)指令 被處理的文檔 前置指令 | awk 選項 (條件)指令
awk '{print}' test 輸出全部 awk '{print $2}' test 輸出每行第2列 awk '/hello/{print $2}' test 找到有hello的行,輸出他的第2列 awk的內置變量 $1 $2 $3..... $0 全部列 NR行號 NF列號
awk默認分隔符爲空格,能夠使用-F修改分隔符 awk -F: '{print $1}' user 定義分隔符爲冒號, 輸出第一列 awk -F[:/] '{print $10}' user 定義分隔符爲冒號或者斜線, 輸出第10列
awk -F: '{print $1"的解釋器是"$7}' user 輸出特定列,常量+變量 ifconfig eth0 | awk '/RX p/{print "本機eth0的接收流量是"$5"字節"}' 獲取網卡接收流量 ifconfig eth0 | awk '/TX p/{print "本機eth0的發送流量是"$5"字節"}' 獲取網卡發送流量
df -h | awk '/vda1/{print "當前主機跟分區剩餘空間是"$4}' 獲取根分區剩餘空間 awk '/Failed/{print "***者的ip是"$11}' /var/log/secure
BEGIN任務 執行1次 逐行任務 執行N次 END任務 執行1次 BEGIN{ }{ }END{ } awk 'BEGIN{指令} {指令} END{指令}' 文件 awk 'BEGIN{print "ABCD"}{print}END{print NR}' user tab鍵 \t 製表符 awk -F: 'BEGIN{print "User\tUid\tHome"}{print $1"\t"$3"\t"$6 }END{print "總計 "NR" 行"}' user
========================================shell
awk -F: '/^root/{print $1}' user 找以root開頭的行,輸出第1列 awk -F: '/^root|^bin/{print $1}' user 找以root或者bin開頭的行,輸出第1列 awk -F: '/^(root|bin)/{print $1}' user 同上 awk -F: '$1~/root/{print $1}' user 找第一列包含root的行,而且輸出第1列 awk -F: '$1!~/root/{print $1}' user 第一列不包含root
awk -F: 'NR==1{print}' user 輸出第1行 awk -F: 'NR>2{print}' user 輸出行號大於2的行 awk -F: 'NR>=2{print}' user 輸出行號大於等於2的行 awk -F: '$1=="root"{print}' /etc/passwd 輸出第1列是root的行 awk -F: '$1~/root/{print}' /etc/passwd 輸出第1列包含root的行 awk -F: '$1~/oot/{print}' /etc/passwd 輸出第1列包含oot的行 awk -F: '$3>1000{print}' /etc/passwd 輸出第三列大於1000的行
awk 'NR>=2 && NR<=4{print}' user 輸出2~4行 awk 'NR<=1 || NR>4{print}' user 輸出第1行,或者大於4的行 awk -F: '$3>=1000 && $3<=1005' /etc/passwd 當任務只是print時能夠省略{print} 輸出全部普通用戶的家目錄與解釋器 例如: 張三的家目錄是XXX ,解釋器是 XXX awk -F: '$3>=1000 && $3<=1100{print $1"的家目錄是"$6",解釋器是"$7 }' /etc/passwd
awk 'BEGIN{x++;print x}' 把x+1 而後輸出x的值 awk 'BEGIN{x=8;print x+=2}' 定義變量x=8, 而後+2再輸出結果 awk 'BEGIN{x=8;x--;print x}' x定義好,而後減1,輸出 awk 'BEGIN{print 2+3}' awk 'BEGIN{print 2*3}' awk 'BEGIN{print 2*3}'
awk 精確搜索文檔 -F 定義分隔符 print $1 $2 $3 .... $0 NR NF "" 正則表達式 / / ~ !~ 字符串與數字 == != > >= < <= 邏輯符號 && || 運算 x++
=============================數組
單分支: awk '{if(/bash$/){x++}}END{print x}' user 若是找到以bash結尾的行,就把x+1,最後輸出x的值 awk -F: '{if($3>=1000){x++}}END{print x}' /etc/passwd 若是第3列(UID)大於等於1000,則把x+1,,最後輸出x的值 雙分支: awk -F: '{if($3>=1000){x++}else{y++}}END{print x,y}' /etc/passwd 若是第3列(UID)大於等於1000,則把x+1,不然把y+1,最後輸出x與y的值
數組名[下標]=元素值 awk 'BEGIN{a[1]=100;a[2]=200;print a[2],a[1]}' awk 'BEGIN{a["x"]=100;a["y"]=200;print a["y"],a["x"]}' awk 'BEGIN{a["x"]="abc";a["y"]="xyz";print a["y"],a["x"]}'
awk 'BEGIN{a[1]=100;a[2]=200;a[3]=300;for(i in a){print i,a[i]}}' awk '{a[$1]++}END{for(i in a){print a[i],i}}' abc a[abc]=3 a[xyz]=2 a[zxc]=1 a[192.168.0.1]=3 a[172.10.10.10]=2 a[100.100.100.100]=1
/var/log/httpd/access_log是httpd服務的訪問日誌 awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log 最終顯示訪問的次數與對應的ip地址 ab -c 1 -n 10000 http://172.25.0.11/ 訪問10000次 awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log | sort -nr 統計完以後再排序,訪問量最大的在第一行
#!/bin/bash n=`uptime |sed -n 's/.*://p'` echo 主機平均負載是$n ifconfig eth0 | awk '/RX p/{print "主機的eth0 網卡接收流量是"$5"字節"}' ifconfig eth0 | awk '/TX p/{print "主機的eth0 網卡發送流量是"$5"字節"}' free -h |awk '/^Mem/{print "主機剩餘內存容量是"$4}' df -h | awk '/\/$/{print "根分區剩餘容量是"$4}' awk 'END{print "當前主機用戶總數是"NR}' /etc/passwd w=`who | wc -l` echo 當前登陸的帳戶數量是$w個 p=`ps aux | wc -l` echo 當前主機開啓的進程數量是$p個 r=`rpm -qa | wc -l` echo 當前主機安裝的軟件包數量是$r個