文章目錄
- 一、awk 編輯器
- 1.作業原理
- 2.命令格式
- 3.awk 常見的內建變數
- 二、實體
- 1.按行輸出文本
- 2.按欄位輸出文本
- 3.通過管道符號、雙引號呼叫shell 命令
一、awk 編輯器
- 在 Linux/UNIX 系統中,awk 是一個功能強大的編輯工具
- 能夠逐行讀取輸入文本,并根據指定的匹配模式進行查找,對符合條件的內容進行格式化輸出或者過濾處理
- 還可以在無互動的情況下實作相當復雜的文本操作
- 被廣泛應用于 Shell 腳本中,完成各種自動化配置任務
1.作業原理
- 逐行讀取文本,默認以空格或 tab 鍵為分隔符進行分隔,將分隔所得的各個欄位保存到內建變數中,并按模式或者條件執行編輯命令
- sed 命令常用于一整行的處理,而 awk 比較傾向于將一行分成多個“欄位”然后再進行處理
- awk 資訊的讀入也是逐行讀取的,執行結果可以通過 print 的功能將欄位資料列印顯示
- 在使用 awk 命令的程序中,可以使用邏輯運算子“&&”表示“與”、“||”表示“或”、“!”表示“非”
- 還可以進行簡單的數學運算,如+、-、*、/、%、^分別表示加、減、乘、除、取余和乘方
2.命令格式
awk 選項 '模式或條件 {操作}' 檔案1 檔案2 …
awk -f 腳本檔案 檔案1 檔案2 …
3.awk 常見的內建變數
| 變數 | 解釋 |
|---|---|
| FS | 列分割符,指定每行文本的欄位分隔符,默認為空格或制表位,與"-F"作用相同 |
| NF | 當前處理的行的欄位個數 |
| NR | 當前處理的行的行號(序數) |
| $0 | 當前處理的行的整行內容 |
| $n | 當前處理行的第n個欄位(第n列) |
| FILENAME | 被處理的檔案名 |
| RS | 行分隔符,awk從檔案上讀取資料時,將根據RS的定義把資料切割成許多條記錄,而awk一次僅讀入一條記錄,以進行處理,預設值是’\n’ |
二、實體
1.按行輸出文本

awk '{print}' 1.txt
#輸出所有內容
awk '{print $0}' 1.txt
#輸出所有內容

awk 'NR==1,NR==3{print}' 1.txt
#輸出第 1~3 行內容
awk '(NR>=1)&&(NR<=3){print}' 1.txt
#輸出第 1~3 行內容
awk 'NR==1||NR==3{print}' 1.txt
#輸出第1行、第3行內容

awk '(NR%2)==1{print}' 1.txt
#輸出所有奇數行的內容
awk '(NR%2)==0{print}' 1.txt
#輸出所有偶數行的內容

awk '/^root/{print}' /etc/passwd
#輸出以 root 開頭的行
awk '/nologin$/{print}' /etc/passwd
#輸出以 nologin 結尾的行
awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd
#統計以/bin/bash 結尾的行數
#等同于 grep -c "/bin/bash$" /etc/passwd
#BEGIN模式表示,在處理指定的文本之前,需要先執行BEGIN模式中指定的動作
#awk再處理指定的文本,之后再執行END模式中指定的動作
#END{}陳述句塊中,往往會放入列印結果等陳述句

2.按欄位輸出文本
awk -F ":" '{print $3}' /etc/passwd
#輸出每行中(以空格或制表位分隔)的第3個欄位

awk -F ":" '{print $1,$3}' /etc/passwd
#輸出每行中的第1、3個欄位

awk -F ":" '$3<5{print $1,$3}' /etc/passwd
#輸出第3個欄位的值小于5的第1、3個欄位內容

awk -F ":" '!($3<200){print}' /etc/passwd
#輸出第3個欄位的值不小于200的行
awk 'BEGIN {FS=":"};{if($3>=200){print}}' /etc/passwd
#先處理完BEGIN的內容,再列印文本里面的內容


awk -F ":" '{max=($3>$4)?$3:$4;{print max}}' /etc/passwd
#($3>$4)?$3:$4三元運算子,如果第3個欄位的值大于第4個欄位的值,則把第3個欄位的值賦給max,否則第4個欄位的值賦給max

awk -F ":" '{print NR,$0}' /etc/passwd
#輸出每行內容和行號,每處理完一條記錄,NR值加1

awk -F ":" '$7~"/bash"{print $1}' /etc/passwd
#輸出以冒號分隔且第7個欄位中包含/bash的行的第1個欄位

awk -F ":" '($1~"root")&&(NF==7){print $1,$2}' /etc/passwd
#輸出第1個欄位中包含root且有7個欄位的行的第1、2個欄位

awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd
#輸出第7個欄位既不為/bin/bash,也不為/sbin/nologin的所有行

3.通過管道符號、雙引號呼叫shell 命令
echo $PATH | awk 'BEGIN{RS=":"};END{print NR}'
#統計以冒號分隔的文本段落數,END{}陳述句塊中,往往會放入列印結果等陳述句

awk -F: '/bash$/{print | "wc -l"}' /etc/passwd
#呼叫 wc -l 命令統計使用 bash 的用戶個數,等同于 grep -c "bash$" /etc/passwd

free -m | awk '/Mem:/ {print int($3/($3+$4)*100)}'
#查看當前記憶體使用百分比

top -b -n 1 | grep Cpu | awk -F ',' '{print $4}' | awk '{print $1}'
#查看當前CPU空閑率,(-b -n 1 表示只需要1次的輸出結果)

date -d "$(awk -F "." '{print $1}' /proc/uptime) second ago" +"%F %H:%M:%S"
#顯示上次系統重啟時間,等同于uptime;second ago為顯示多少秒前的時間,+"%F %H:%M:%S"等同于+"%Y-%m-%d %H:%M:%S"的時間格式

awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}"%"}'
#呼叫w命令,并用來統計在線用戶數

awk 'BEGIN {"hostname" | getline ; {print $0}}'
#呼叫 hostname,并輸出當前的主機名

- 當getline左右無重定向符“<”或“|”時,getline作用于當前檔案,讀入當前檔案的第一行給其后跟的變數var或$0;應該注意到,由于awk在處理getline之前已經讀入了一行,所以getline得到的回傳結果是隔行的
- 當getline左右有重定向符“<”或“|”時,getline則作用于定向輸入檔案,由于該檔案是剛打開,并沒有被awk讀入一行,只是getline讀入,那么getline回傳的是該檔案的第一行,而不是隔行
seq 10 | awk '{print $0; getline}'
seq 10 | awk '{getline; print $0}'

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257205.html
標籤:其他
