一、awk編輯器
1.1 awk概述
- awk:是一種處理文本文件的語言,是一個強(qiáng)大的文本分析工具。
1.2 awk工作原理
- awk:逐行讀取文本,默認(rèn)以空格或tab鍵為分隔符進(jìn)行分隔,將分隔所得的各個字段保存到內(nèi)建變量中,并按模式或者條件執(zhí)行編輯命令。
1.3 awk與sed的區(qū)別
- 1、sed命令常用于一整行的處理,而awk比較傾向于將一行分成多個“字段”然后再進(jìn)行處理。
- 2、awk信息的讀入也是逐行讀取的,執(zhí)行結(jié)果可以通過print的功能將字段數(shù)據(jù)打印顯示
- 3、在使用awk命令的過程中,可以使用邏輯操作符“&&”表示“與”、“||”表示“或”,“!”表示“非”
- 4、awk還可以進(jìn)行簡單的數(shù)學(xué)運算,如"+、、-、*、/、%、^"分別表示加、減、乘、除、取余和乘方
二、awk的應(yīng)用
2.1 命令格式
awk 選項 ‘模式或條件 {操作}’ 文件1 文件2...
awk -f 腳本文件 文件1 文件2...
2.2 awk常見的內(nèi)建變量(可直接用)
常見內(nèi)建變量 | 說明 |
---|---|
FS |
列分割符。指定每行文本的字段分隔符,默認(rèn)為空格或制表位。與"-F"作用相同 |
NF |
當(dāng)前處理的行的字段個數(shù),$NF代表當(dāng)前所在行的最后一個字段 |
NR |
當(dāng)前處理的行的行號(序數(shù)) |
$0 |
當(dāng)前處理的行的整行內(nèi)容 |
$n |
當(dāng)前處理行的第n個字段(第n列) |
FILENAME |
被處理的文件名 |
RS |
行分隔符。awk從文件上讀取資料時,將根據(jù)RS的定義把資料切割成許多條記錄,而awk一次僅讀入一條記錄,以進(jìn)行處理。預(yù)設(shè)值是’\n’ |
三、awk使用
3.1 按行輸出文本
awk '{print}' testfile2 #輸出所有內(nèi)容
awk '{print $0}' testfile2 #輸出所有內(nèi)容
awk 'NR==1,NR==3{print}' testfile2 #輸出第 1~3 行內(nèi)容
awk '(NR>=1)&&(NR<=3){print}' testfile2 #輸出第 1~3 行內(nèi)容
awk 'NR==1||NR==3{print}' testfile2 #輸出第1行、第3行內(nèi)容
awk '(NR%2)==1{print}' testfile2 #輸出所有奇數(shù)行的內(nèi)容
awk '(NR%2)==0{print}' testfile2 #輸出所有偶數(shù)行的內(nèi)容
awk '/^root/{print}' /etc/passwd #輸出以 root 開頭的行
awk '/nologin$/{print}' /etc/passwd #輸出以 nologin 結(jié)尾的行
awk '(NR%2)==1 {print NR}' testfile1
awk '(NR%2)==1 {print NR $0}' testfile1
awk '(NR%2)==1 {print NR','$0}' testfile1
awk '(NR%2)==1 {print NR","$0}' testfile1 #只有用雙引號才能指定間隔符號,否則默認(rèn)使用空格符號,上面的單引號加不加沒區(qū)別
awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd #統(tǒng)計以/bin/bash 結(jié)尾的行數(shù),等同于 grep -c "/bin/bash$" /etc/passwd
BEGIN模式表示:在處理指定的文本之前,需要先執(zhí)行BEGIN模式中指定的動作;awk再處理指定的文本,之后再執(zhí)行END模式中指定的動作,END{}語句塊中,往往會放入打印結(jié)果等語句
3.2 按字段輸出文本
awk -F: '/^root/ {print $2}' /etc/passwd #輸出root開頭的第二個字段
awk -F: '/^root/ {print $2,$4}' /etc/passwd #輸出root開頭的第二、四字段
awk -F: '/^root/ {print $0}' /etc/passwd #輸出root開頭的行
awk -F: '/^root/ {print $NF}' /etc/passwd #輸出root開頭的最后一個字段
文章來源:http://www.zghlxwxcb.cn/news/detail-454662.html
awk -F ":" '!($3<200){print}' /etc/passwd #輸出第3個字段的值不小于200的行
awk 'BEGIN {FS=":"};{if($3>=1000){print}}' /etc/passwd #以冒號間隔,打印第三個字段的值大于等于1000的行
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 #輸出每個行號,最后統(tǒng)計總行數(shù)
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.3 通過管道、雙引號調(diào)用 Shell 命令
echo $PATH | awk 'BEGIN{RS=":"};END{print NR}' #統(tǒng)計以冒號分隔的文本段落數(shù),打印行號
awk -F: '/bash$/{print | "wc -l"}' /etc/passwd #調(diào)用 wc -l 命令統(tǒng)計使用 bash 的用戶個數(shù),等同于 grep -c "bash$" /etc/passwd
free -m | awk '/Mem:/ {print int($3/($3+$4)*100)"%"}' #查看當(dāng)前內(nèi)存使用百分比
top -b -n 1 | grep Cpu | awk -F ',' '{print $4}' | awk '{print $1}' #查看當(dāng)前CPU空閑率,(-b -n 1 表示只需要1次的輸出結(jié)果)
date -d "$(awk -F "." '{print $1}' /proc/uptime) second ago" +"%F %H:%M:%S" #顯示上次系統(tǒng)重啟時間,等同于uptime;second ago為顯示多少秒前的時間,+"%F %H:%M:%S"等同于+"%Y-%m-%d %H:%M:%S"的時間格式。/proc/uptime 第一列輸出的是:系統(tǒng)啟動到現(xiàn)在的時間(以秒為單位);第二列輸出的是:系統(tǒng)空閑的時間(以秒為單位)
date -d "$(date -d"1 month" +"%Y%m01") -3 day" +"%Y%m%d" #當(dāng)月倒數(shù)第三天
date +"%Y%m01" #當(dāng)月第一天
awk 'BEGIN {n=0 ; while ("w" | getline) n++ ; {print n-2}}' #調(diào)用w命令,并用來統(tǒng)計在線用戶數(shù)
awk 'BEGIN {"hostname" | getline ; {print $0}}' #調(diào)用 hostname,并輸出當(dāng)前的主機(jī)名
seq 10 | awk '{getline; print $0}' #獲取偶數(shù)行
seq 10 | awk '{print $0; getline}' #獲取基數(shù)行
當(dāng)getline左右無重定向符“<”或“|”時,awk首先讀取到了第一行,就是1,然后getline,就到了1下面的第二行,就是2,因為getline之后,awk會改變對應(yīng)的NF,NR,F(xiàn)NR和$0等內(nèi)部變量,所以此時的$0的值就不再是1,而是2了,然后將它打印出來。 當(dāng)getline左右有重定向符“<”或“|”時,getline則作用于定向輸入文件,由于該文件是剛打開,并沒有被awk讀入一行,只是getline讀入,那么getline返回的是該文件的第一行,而不是隔行。 FNR:awk當(dāng)前讀取的記錄數(shù),其變量值小于等于NR(比如當(dāng)讀取第二個文件時,F(xiàn)NR是從0開始重新計數(shù),而NR不會)。 NR==FNR:用于在讀取兩個或兩個以上的文件時,判斷是不是在讀取第一個文件
文章來源地址http://www.zghlxwxcb.cn/news/detail-454662.html
awk -F: '$1 ~ /root/ && $NF ~ /\/bin\/bash/ {print}' /etc/passwd #輸出/etc/passwd/文件中首字段包含 root 且最后一個字段包含/bin/bash/的行,取反則在“~”加上“!”
到了這里,關(guān)于Linux:文本三劍客之a(chǎn)wk的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!