如有顯示不全,請點擊此處轉到有道雲筆記
知識要點
awk命令的工作原理
awk的基本命令
awk的內部變量
awk的自定義變量
awk的流程控制語句
awk命令的工作原理
gawk (gnu awk
)
- Unix中awk的GNU版本,完成grep和sed的工作
- 支持數學運算,流程該控制內置大量的變量和函數
awk命令工作原理
- 與sed一樣, 均是一行一行的讀取、處理
- sed作用於一整行的處理, 而awk將一行分成數個字段來處理
awk命令的簡要處理流程

awk的用-F來指定分隔符
- 默認的字段分隔符是任意空白字符(空格或者TAB)
- 舉例對比cut和awk的區別
awk的數據字段變量
- $0表示整行文本
- $1表示文本中第一個數據字段
- $2表示文本中第二個數據字段
- $n表示文本中第n個數據字段
awk命令的語法
awk命令的完整語法

awk的命令的執行過程
- 執行BEGIN{commands}語句塊中的語句
- 從文件或stdin中讀取第1行,
- 有無模式匹配, 若無則執行{}中的語句,
- 若有則檢查該整行與pattern是否匹配, 若匹配, 則執行{}中的語句,
- 若不匹配則不執行{}中的語句,接着讀取下一行
- 重復這個過程, 直到所有行被讀取完畢
- 執行END{commands}語句塊中的語句
awk命令的基本語法
- awk -F 分隔符 ‘/模式/{動作}’ 輸入文件
指令由模式和動作結合
- awk的指令一定要用單引號括起
- awk的動作一定要用花括號括起
- 模式可以是正則表達式、條件表達式或兩種組合
- 如果模式是正則表達式要用/定界符
- 多個動作之間用;號分開
awk基本命令示例
- awk '/bash/' /etc/passwd
只有模式沒有動作結果和grep一樣,顯示$0
- who | awk '{print $2}‘
只有動作沒有模式就直接執行動作
- awk -F: '/^h/{print $1,$7}' /etc/passwd
print執行顯示功能將文本輸出到STDOUT
以冒號為分隔符,顯示以h開頭的行的第一列和第七列
- awk -F: '/^[^h]/{print $1,$7}' /etc/passwd
不顯示以h開頭的行的第一列和第七列
- awk -F '[:/]' '{print $1,$10}' /etc/passwd
以:或者/作為分隔符顯示第1列和第10列
awk命令的操作符
- 正則表達式和bash一致
- 數學運算:+,-,*,/, %,++,- -
- 邏輯關系符:&&, ||, !
- 比較操作符:>,<,>=,!=,<=,== ~ !~
- 文本數據表達式:== (精確匹配)
- ~波浪號表示匹配后面的模式
- who | awk '$2 ~ /pts/{print $1}‘
- awk -F: '$3 ~ /\<...\>/ {print $1,$3}' /etc/passwd
- seq 100 | awk '$1 % 5 == 0 || $1 ~ /^1/{print $1}'
- awk -F: '$1 == "root"{print $1,$3}' /etc/passwd
awk基本命令示例
- awk -F: '$3>=500{print $1}' /etc/passwd
顯示UID大於等於500行的用戶名
- awk -F: '$3>=500 && $3<=60000{print $1}' /etc/passwd
顯示普通用戶名
- awk -F: '$3 != $4 {print $1}' /etc/passwd
顯示UID不等於GID的用戶名
- awk -F: '/^h/ && /bash/{print $1}' /etc/passwd
顯示用戶名以h開頭的普通用戶
- ps aux | awk '$2 <=10 {print $11}'
- awk 'BEGIN{print "line one\nline two\nline three"}'
顯示后面三行
- awk 'END{print "line one\nline two\nline three"}'
按ctrl+D開始顯示后面三行
- awk 'BEGIN{print "start..."}{print $1}END{print "end..."}' test
顯示文件的內容並在前面加上start和后面加上end
- awk 'BEGIN{i=0}{i++}END{print i}' /etc/passwd
顯示文件的行數
awk命令的變量
awk命令的內部變量
awk基本命令示例
- awk '{print NF}' /etc/grub.conf
顯示每行的字段數目
- awk '{print $1,$NF}' /etc/grub.conf
顯示每行的第一字段 和最后一個字段
- awk '{print NR,$0}' /etc/grub.conf
顯示每行的內容和行號
- awk -F: 'BEGIN{OFS="---"}{print $1,$7}' /etc/passwd
顯示第一列和第七列,中間用---隔開
- awk 'BEGIN{FS=":"}/bash$/{print NR,$1}END{print NR}' /etc/passwd
顯示符合模式的用戶名和所在的行號最后顯示總行號
- awk ‘NR==3,NR==5’ /etc/grub.conf
顯示文件的
3到5行
- awk 'NR<=10' /etc/fstab
顯示文件的前10行
awk基本實驗案例1
- 分析下面三條命令的區別,為什么
awk 'BEGIN{print NR}' /etc/passwd
awk '{print NR}' /etc/passwd
awk 'END{print NR}' /etc/passwd
- 分析下面命令的執行結果
awk -F: '{print $NR}' /etc/passwd
awk -F: '{print NR, NF, $1, $NF, $(NF-1)}' /etc/passwd
- 只顯示df -h結果的第一列文件系統
- 顯示passwd文件的第5行和第10行的行號和用戶名
awk基本實驗案例2
- 使用NF變量顯示passwd文件倒數第二列的內容
- 顯示passwd文件中第5到第10行的用戶名
- 顯示passwd文件中第7列不是bash的用戶名
- 顯示passwd文件中行號是5結尾的行號和行
- 用ifconfig只顯示ip(不能使用tr或者cut命令)
- 使用awk顯示eth0的入站流量和出站流量(字節)
- 使用awk命令統計以r開頭的用戶數目,顯示如下效果

awk命令的引用shell變量
- -v 引入shell變量


- 分析下面腳本的意思

awk命令的函數
- awk編程語言內置了很多函數
- 例如利用length計算字符數目的函數來檢查有無空口令用戶

顯示文件中超過60個字符的行

awk命令的結構化語句
if語句
單分支

- awk -F: '{if($1 ~ /\<...\>/)print $0}' /etc/passwd
- awk -F: '{if($3 >= 500)print $1,$7}' /etc/passwd
雙分支

- awk -F: '{if($3 != 0) print $1 ; else print $3}' /etc/passwd
多分支
- awk -F: '{if($1=="root") print $1; else if($1=="ftp") print $2; else if($1=="mail") print $3; else print NR}' /etc/passwd
awk命令if語句案例
監控多台主機的磁盤分區一旦某台被監控主機的任一分區使用率大於80%, 就給root發郵件報警

實驗案例3
檢查/var/log/secure日志文件,如果有主機用root用戶連接服務器的ssh服務失敗次數超過10次(10次必須使用變量),就將這個IP地址加入/etc/hosts.deny文件拒絕其訪問,如果這個IP已經存在就無需重復添加到/etc/hosts.deny文件
