目錄
工作原理
命令格式
普通格式
BEGIN格式
語句循環格式
awk常見的內建變量(可直接用)
按行打印行內容
統計行數量
按字段輸出文本
通過管道、雙引號調用 Shell 命令
awk編輯器是一種流編輯器
工作原理
- 逐行讀取文本,默認以空格或tab鍵為分隔符進行分隔,將分隔所得的各個字段保存到內建變量中,并按模式或者條件執行編輯命令。
- awk信息的讀入也是逐行讀取的,執行結果可以通過print的功能將字段數據打印顯示。
- 在使用awk命令的過程 中,可以使用邏輯操作符“&&“表示“與”、“||“表示“或”、“!“表示“非”;還可以進行簡單的數學運算,如+、-、*、/、%、^分別表示加、減、乘、除、取余和乘方。
命令格式
普通格式
awk 選項 '模式或條件 {操作}' 文件 1 文件 2 …? ? ? #對文件1,文件2進行操作
awk -f 腳本文件 文件 1 文件 2 …? ? ? ? ? ? ? ? ? ? ? ? ? ?#用腳本對對文件1,文件2進行操作
BEGIN格式
awk 'BEGIN {...}; 條件{...}; END {...}' ?文件? ? ?
- ? BEGIN {...} ? 表示處理文件前要執行的操作
- ? 條件{...} ? ? 表示對匹配滿足指定條件的文件行內容要執行的操作
- ? END {...} ? ? 表示處理完文件所有行內容后要執行的操作
語句循環格式
awk '{控制語句條件 {操作}}' 文件
awk 'if(條件表達式) {操作}' 文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ??#行內容滿足if的條件則執行操作??
awk '變量=條件表達式?值1:值2; {操作}' 文件 ? ? ?
?#行內容是否條件表達式,如果條件成立則變量取值1,條件不成立則變量取值2
awk 'BEGIN{執行循環前的操作; while("命令" | getline) 每次循環的操作; 執行循環完后的操作}'? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#使用while循環對每行內容執行操作
?
awk常見的內建變量(可直接用)
- FS:列分割符。指定每行文本的字段分隔符,默認為空格或制表位。與"-F"作用相同
- NF:當前處理的行的字段個數。
- NR:當前處理的行的行號(序數)。
- $0:當前處理的行的整行內容。
- $n:當前處理行的第n個字段(第n列)。
- FILENAME:被處理的文件名。
- RS:行分隔符。awk從文件上讀取資料時,將根據RS的定義把資料切割成許多條記錄,而awk一次僅讀入一條記錄,以進行處理。預設值是'\n'
- FNR:awk當前讀取的記錄數,其變量值小于等于NR(比如當讀取第二個文件時,FNR是從0開始重新計數,而NR不會)。
NR==FNR:用于在讀取兩個或兩個以上的文件時,判斷是不是在讀取第一個文件
按行打印行內容
awk '{print $0}' 文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#打印文件里所有內容
awk 'NR=1{print $0}' 文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #打印文件里第一行內容
awk 'NR=1,NR=3{print $0}' 文件? ? ? ? ? ? ? ? ? ? #答應文件里第一行到第三行的內容
awk 'NR>=80{print $0}' 文件? ? ? ? ? ? ? ? ? ? ? ? ? #打印文件里80行以后的內容
awk '(NR>=70)&&(NR<=80){print $0}' 文件? ?#打印文件70行到80行的內容
awk '(NR>=70)||(NR<=80){print $0}' 文件? ? ? #打印文件70行和80行的內容
awk '(NR<=3)||(NR>=80){print $0}' 文件?? ? ? ?#打印文件前3行和后80行的內容
awk '(NR%)==1 {print $0}' 文件? ? ? ? ? ? ? ? ? ? ? #打印文件奇數行
awk '{print $0;getline}' 文件? ? ? ? ? ? ? ? ? ? ? ? ? ??#打印文件奇數行? ?getline為跳到下一行
awk '(NR%)==0 {print $0}' 文件? ? ? ? ? ? ? ? ? ? ??#打印偶數行
awk '{getline;print $0}' 文件? ? ? ? ? ? ? ? ? ? ? ? ? ??#打印偶數行? ? ? ? ? ?getline為跳到下一行? ?
awk '/root/{print $0}' 文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#打印包含root的行內容
awk '/\/bin\/bash$/{print $0}' 文件? ? ? ? ? ? ? ? ? ?#打印以/bin/bash結尾的行內容???
統計行數量
awk 'BEGIN {X=0}; /bash$/ {x++};END {print x}' 文件? ? ? #統計以bash結尾的行數
awk 'BEGIN {n=0;while("who" | getline)n++; print $n}'? ?#統計who命令的有多少行
按字段輸出文本
默認以空格或tab鍵為分隔符進行分隔
awk -F ":" '{print $3}' 文件? ? ? ? ? ? ? ? ? ?#輸出每行中(以:分隔)的第3個字段
awk -F ":" '{print $1,$3}' 文件? ? ? ? ? ? ? #輸出每行中(以:分隔)的第1、3個字段awk -F ":" '$3<5{print $1,$3}' 文件? ? ?
#輸出每行(以:分隔)第3個字段的值小于5的第1、3? 個字段內容
awk -F ":" '!($3<200){print $0}' 文件? ? ? ? ? ? ? ?#輸出每行第3個字段的值不小于200的行
awk -F ":" '/bash$/ {print $1":"$3}' 文件? ? ? ?#輸出每行以bash結尾的,并且以:分隔的第?一個字段和第三個字段,最后以:分隔輸出內容
awk -F ":" '$3<5{print $1,$3,$NF}' 文件? ? ?
#輸出每行(以:分隔)第3個字段的值小于5的第1、3個字段和最后一個字段內容?
awk -F ":" '$3<5{print NR,$0}' 文件? ? ? ? ? ? ? ? ? ? ? ??#打印行號,同行輸出?
awk -F ":" '$3<5{print NR} $3<5{print $0}' 文件? ? #打印行號,不同行輸出?
awk -F ":" '$3~“bash”{print $0}' 文件? ? ? ? ? ? ?
?#輸出每行中(以:分隔)的第3個字段包含bash的行內容? ? ? ? ? ?~ 表示包含的意思
通過管道、雙引號調用 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"?
?#顯示上次系統重啟時間
awk 'BEGIN {n=0 ; while ("w" | getline) n++ ; {print n-2}}'?
#調用w命令,并用來統計在線用戶數
awk 'BEGIN {"hostname" | getline ; {print $0}}'?? ?#調用 hostname,并輸出當前的主機名