AWK是什么
Linux文本三劍客之一(grep,sed,awk),功能最強(qiáng)大的文本工具。
逐行讀取輸入的文本內(nèi)容,默認(rèn)以空格和tab鍵作為分隔符。但是多個(gè)空格或者tab鍵的空格,會(huì)自動(dòng)壓縮成一個(gè),然后按照指定的模式和條件執(zhí)行編輯命令
可以在免交互的情況下,實(shí)現(xiàn)復(fù)雜的文本操作。完成自動(dòng)化配置。
awk格式
awk '操作符 action' file
操作符:想干啥
action:怎么做
file:處理對(duì)象?
例如:
awk 'BEGIN{x=1};{x++};END{處理動(dòng)作}' 文件名
awk '操作符 {處理動(dòng)作}' 文件名
{}外部表示定義條件
{}內(nèi)指定操作
BEGIN對(duì)條件做初始化操作
for ((i=1;i<=10;i++))
awk常用選項(xiàng)
-F:指定分隔符,如果是空格,tab鍵,可以不加
-v:變量賦值,awk無(wú)法從外部獲取變量
awk的內(nèi)置變量:
NR:需要處理行號(hào)
FS:列分隔符 和F作用一致,如果用FS,則? FS=":"
OFS:輸出內(nèi)容的列分隔符
NF:表示最后一個(gè)字段
$n:內(nèi)置變量
awk '{print NR}' /etc/passwd
顯示行號(hào)
awk '{print NR $0}' /etc/passwd
顯示行號(hào)和內(nèi)容
awk 'NR==3,NR==5{print}' /etc/passwd
第三行和第五行
awk 'NR==3;NR==5{print}' /etc/passwd
第三行到第五行
awk '(NR>=3)&&(NR<=5){print}' test.txt
第三行到第五行
awk 'NR%2==0{print}' test.txt
打印偶數(shù)行
awk 'NR%2==1{print}' test.txt
打印奇數(shù)行
awk的運(yùn)算--求冪運(yùn)算
[root@hj ~]# awk 'BEGIN{print 2^3}'
8
[root@hj ~]# awk 'BEGIN{print 2**3}'
8
awk按行取列(最重要)
awk -F: '{print $2,$NF}' /etc/passwd
大寫(xiě)的NF為最后一列
$x:第幾列
表示打印第二列和最后一列
AWK的精確篩選
$n (> < ==);進(jìn)行數(shù)值對(duì)比
$n~"字符串" 代表這個(gè)字段包含某個(gè)字符串
$n!~"字符串" 代表這個(gè)字段不包含某個(gè)字符串
$n=="字符串" 代表這個(gè)字段要和字符串相同
$n!="字符串" 取反,不為某個(gè)字段
$NF:代表最后一個(gè)字段
下面舉幾個(gè)例子方便大家理解:
1./etc/passwd 輸出最后一個(gè)字段中包含bash所在行的第一個(gè)字段和最后一個(gè)字
awk -F: '$NF~"bash" {print $1,$NF}' /etc/passwd
2./etc/passwd 只有第一列是root的行,才打印他的第六行
awk -F: '$1=="root" {print $6}' /etc/passwd
3.輸出最后一個(gè)字段,不包含bash,打印第一列和第六列
awk -F: '$NF~"bash" {print $1,$6}' /etc/passwd
需要注意:
~:是包含的意思
==:為“是”的意思
二者有很大區(qū)別
4.指定第6個(gè)字段為/home/hj?而且最后一個(gè)字段為/bin/bash 滿(mǎn)足條件的輸出第一列和最后一列
awk -F: '($6=="/home/hj")&&($NF=="/bin/bash") {print $1.$NF}' /etc/passwd
條件判斷打印
結(jié)合if語(yǔ)句使用
if $3>500 打印所有
AWK三元表達(dá)式
awk三元表達(dá)式繼承了java,格式和Java也一樣
awk '{條件表達(dá)式1 ? A表達(dá)式或者值:B表達(dá)式或者值}' 文件名
awk -F: '{max=($3>=$4)?$3:$4;{print max $0}}' /etc/passwd
?:
if else
if [ $3>=$4 ]
then
echo $3
else
echo $4
fi
文本內(nèi)容匹配打印
打印/etc/passwd中以root開(kāi)頭的行
awk '/^root/{print}' /etc/passwd
getline函數(shù):getline和管道符以及重定向符號(hào)在一塊的時(shí)候,才有特殊功效
重定向:<> 把其中一個(gè)文件的內(nèi)容傳給另外一個(gè)
| :輸出指定內(nèi)容,先到定義的變量,再由getline調(diào)用變量當(dāng)中的內(nèi)容,最后打印出結(jié)果。
getline函數(shù)運(yùn)行之后,會(huì)改變awk的內(nèi)置變量,讀取的行數(shù)也會(huì)發(fā)生變化,getline在前,就是第一行跳過(guò),打印第二行
getline在后,從第一行開(kāi)始,跳過(guò)第二行,打印的就是奇數(shù)
-v給變量賦值
BEGIN模式
對(duì)變量初始化。需要初始化變量的時(shí)候才會(huì)使用
格式
awk 'BEGIN{x=1};{x++};{print x}' test.txt
對(duì)行數(shù)計(jì)算
awk和數(shù)組結(jié)合使用
awk中如何定義數(shù)組
原理:索引的下標(biāo)是唯一的
a是遍歷了所有數(shù)組,把結(jié)果賦值給i,i在下面繼續(xù)
本章結(jié)束,
下面有幾個(gè)實(shí)例可供參考:
1.日志分割:
2.
free 內(nèi)存監(jiān)控
df -h 磁盤(pán)監(jiān)控
top 動(dòng)態(tài)進(jìn)程監(jiān)控
top -b -n 1靜態(tài)
監(jiān)控內(nèi)存的百分比(不超過(guò)90%,超過(guò)警報(bào)),磁盤(pán)(不超過(guò)80%),進(jìn)程(75%),寫(xiě)成函數(shù)庫(kù),以定時(shí)任務(wù)的方式每天早上十點(diǎn)整執(zhí)行,
函數(shù)庫(kù)調(diào)用實(shí)現(xiàn)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-728630.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-728630.html
到了這里,關(guān)于Linux文本三劍客---awk的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!