awk应用小结(所有命令行均经调试)
生活随笔
收集整理的這篇文章主要介紹了
awk应用小结(所有命令行均经调试)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
awk
調(diào)用:
1.調(diào)用awk:
第一種方式:命令行方式
awk [-F field-separator] 'commands' input-file(s)
[-F域分隔符]是可選的,因?yàn)閍wk使用空格作為缺省的域分隔符,因此如果要瀏覽域間有空格的文本,不必指定這個(gè)選項(xiàng),如果要瀏覽諸如passwd文件,此文件各域以冒號(hào)作為分隔符,則必須指明-F選項(xiàng),如:
awk -F: 'commands' input-file
第二種方式是將所有awk命令插入一個(gè)文件,并使awk程序可執(zhí)行,然后用awk命令解釋器作為腳本的首行,以便通過(guò)鍵入腳本名稱(chēng)來(lái)調(diào)用它。
第三種方式是將所有的awk命令插入一個(gè)單獨(dú)文件,然后調(diào)用:
awk -f awk-scrīpt-file input-files(s)
-f選項(xiàng)指明在文件awk_scrīpt_file中的awk腳本,input_file(s)是使用awk進(jìn)行瀏覽的文件名。?
模式和動(dòng)作
任何awk語(yǔ)句都由模式和動(dòng)作組成。在一個(gè)awk腳本中可能有許多語(yǔ)句。模式部分決定動(dòng)作語(yǔ)句何時(shí)觸發(fā)及觸發(fā)事件。處理即對(duì)數(shù)據(jù)進(jìn)行的操作。如果省略模式 部分,動(dòng)作將時(shí)刻保持執(zhí)行狀態(tài)。模式可以是任何條件語(yǔ)句或復(fù)合語(yǔ)句或正則表達(dá)式。模式包括兩個(gè)特殊字段 BEGIN和END。使用BEGIN語(yǔ)句設(shè)置計(jì)數(shù)和打印頭。BEGIN語(yǔ)句使用在任何文本瀏覽動(dòng)作之前,之后文本瀏覽動(dòng)作依據(jù)輸入文本開(kāi)始執(zhí)行。END語(yǔ) 句用來(lái)在awk完成文本瀏覽動(dòng)作后打印輸出文本總數(shù)和結(jié)尾狀態(tài)標(biāo)志。
域和記錄
使用$1,$3表示參照第1和第3域,注意這里用逗號(hào)做域分隔。如果希望打印一個(gè)有5個(gè)域的記錄的所有域,可使用$0,意即所有域。
為打印一個(gè)域或所有域,使用print命令。這是一個(gè)awk動(dòng)作
模式和動(dòng)作
模式:兩個(gè)特殊斷 BEGIN和END
動(dòng)作:實(shí)際動(dòng)作大多在{}內(nèi)指明
輸出
1.抽取域
awk -F: '{print $1}' /etc/passwd
2.保存輸出
awk -F: '{print $1}' /etc/passwd | tee user 使用tee命令,在輸出文件的同時(shí),輸出到屏幕
使用標(biāo)準(zhǔn)輸出
awk -F: '{print $1}' /etc/passwd >user3
4.打印所有記錄
awk -F: '{print $0}' /etc/passwd
5.打印單獨(dú)記錄
awk -F: '{print $1,$4}' /etc/passwd
6.打印報(bào)告頭
awk -F: 'BEGIN {print "NAME\n"} {print $1}' /etc/passwd
7.打印結(jié)尾
awk -F: '{print $1} END {print "this is all users"}' /etc/passwd
條件操作符
1.匹配
awk -F: '{if($1~/root/) print }' /etc/passwd //{if($1~/root/) print}表示如果field1包含root,打印它
2.精確匹配
使用等號(hào) ==
awk -F: '{if($3=="0") print }' /etc/passwd?
3.不匹配
!~
awk -F: '{if($1!~/linuxtone/) print }' /etc/passwd
!=
精確不匹配
awk -F: '{if($1!="linuxtone") print }' /etc/passwd
4.小于
<
5.小于等于
<=
6.大于
>
.........
7.設(shè)置大小寫(xiě)
awk '/[Rr]oot/' /etc/passwd
8.任意字符
awk -F: '{if($1~/^...t/) print}' /etc/passwd //^...t表示第四個(gè)字幕是t
9.或關(guān)系匹配
awk -F: '{if ($1~/(squid|nagios)/) print}' /etc/passwd
10.行首
awk '/^root/' /etc/passwd // ^root(行首包含root)
11.AND &&
awk -F: '{if($1=="root" && $3=="0") print}' /etc/passwd
12.OR ||
內(nèi)置變量:
ARCC 命令行參數(shù)個(gè)數(shù)
ARGV 命令行參數(shù)排列
ENVIRON 支持隊(duì)列中系統(tǒng)環(huán)境變量的使用
FNR 瀏覽文件的記錄數(shù)
FS 置頂分隔符,等價(jià)于-F
NF 瀏覽記錄的域的個(gè)數(shù)
NR 已讀的記錄數(shù)
OFS 輸出域分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符
打印有多少行記錄
awk 'END {print NR}' /etc/passwd
設(shè)置輸入域到變量名
awk -F: '{name=$1; path=$7; if(name~/root/) print name "\tpath is:" path}' /etc/passwd
域值比較操作
awk '{if($6<$7) print $0}' input-file
修改文本域只顯示修改改記錄
awk -F: '{if($1=="nagios") {$1="nagios server" ; print }}' /etc/passwd
文件長(zhǎng)度相加
ls -l|awk '/^[^d]/ {print $9"\t" $5} {tot+=$5} END {print "total kb:"tot}'
內(nèi)置的字符竄函數(shù)
gsub(r,s) 在整個(gè)$0中用s替代r
gsub(r,s,t) 在整個(gè)t中用s替代r
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s長(zhǎng)度
match(s,r) 測(cè)試s中是否包含匹配r的字符串
split(s,a,fs) 在fs上將s分成序列a
sub(s, ) 用$0中最左邊也是最長(zhǎng)的字符串替代
subtr(s,p) 返回字符串s中從p開(kāi)始的后綴部分
substr(s,p,n) 返回字符串s中從p開(kāi)始長(zhǎng)度為n的后綴部分
1.gsub
awk 'gsub(/^root/,"netseek") {print}' /etc/passwd 將與root開(kāi)頭的root替換為netseek
awk 'gsub(/0/,2) {print}' /etc/fstab?
awk '{print gsub(/0/,2) $0}' /etc/fstab?
2.index
awk 'BEGIN {print index("root","o")}' 查詢(xún)字符串root中o出現(xiàn)的第一位置
awk -F: '$1=="root" {print index($1,"o")" "$1}' /etc/passwd
awk -F: '{print index($1,"o") $1}' /etc/passwd
3.length
awk -F: '{print length($1)'} /etc/passwd
awk -F: '$1=="root" {print length($1)}' /etc/passwd
4.match (在ANCD中查找C的位置)
awk 'BEGIN {print match("ANCD",/C/)}'
5.split
返回字符串?dāng)?shù)組元素個(gè)數(shù)
awk 'BEGIN {print split("123#456#789", myarray, "#")}'
6.sub 只能替換指定域的第一個(gè)0
awk 'sub(/0/,2) {print }' /etc/fstab
7.substr?
按照起始位置及長(zhǎng)度返回字符串的一部分
awk 'BEGIN {print substr("www.linuxtone.org",5,9)}' //第5個(gè)字符開(kāi)始,取9個(gè)字符。
awk 'BEGIN {print substr("www.linuxtone.org",5)}' //第5個(gè)位置開(kāi)始,取后面的所有.
字符串屏蔽序列
\b 退格鍵
\f 走紙換頁(yè)
\n 新行
\r 回車(chē)
\t tab
\c 任意其他特殊字符
\ddd 八進(jìn)制
很簡(jiǎn)單的例子
awk -F: '{print $1,"\b"$2,"\t"$3}' /etc/passwd 輸出函數(shù)printf(注意是printf不是print,兩者效果不同的)
printf函數(shù)擁有幾種不同的格式化輸出功能
printf修飾符
- 左對(duì)齊
Width 域的步長(zhǎng)0表示0步長(zhǎng)
.prec 最大字符串長(zhǎng)度,或小數(shù)點(diǎn)右邊的位數(shù)
awk printf格式
%c ASCII字符
%d 整數(shù)
%e 浮點(diǎn)數(shù),科學(xué)計(jì)數(shù)法
%f 浮點(diǎn)數(shù)
%g awk決定使用哪種浮點(diǎn)數(shù)轉(zhuǎn)換,e或者f
%o 八進(jìn)制數(shù)
%s 字符串
%x 十六進(jìn)制數(shù)
1.字符串轉(zhuǎn)換
echo "65" | awk '{printf"%c\n",$0}'
awk 'BEGIN {printf "%c\n",65}'
awk 'BEGIN {printf "%f\n",999}'
2.格式化輸出
awk -F: '{printf "%-15s %s\n",$1,$3}' /etc/passwd
awk -F: 'BEGIN {printf"USER\t\tUID\n"} {printf "%-15s %s\n",$1,$3}' /etc/passwd
3.向一行awk命令傳值
who | awk '{if ($1 == user) print $1 " you are connected to:" $2}' user=$LOGNAME
4.awk腳本文件 (在文件名字后面加后綴.awk方便區(qū)分)
#!/bin/awk -f
BEGIN{
FS=":"
print "User\t\tUID"
print"____________________________"
}
{printf "%-15s %s\n",$1,$3}
END{
print "END"
}
本文轉(zhuǎn)自 mcshell 51CTO博客,原文鏈接:http://blog.51cto.com/mcshell/211440,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
調(diào)用:
1.調(diào)用awk:
第一種方式:命令行方式
awk [-F field-separator] 'commands' input-file(s)
[-F域分隔符]是可選的,因?yàn)閍wk使用空格作為缺省的域分隔符,因此如果要瀏覽域間有空格的文本,不必指定這個(gè)選項(xiàng),如果要瀏覽諸如passwd文件,此文件各域以冒號(hào)作為分隔符,則必須指明-F選項(xiàng),如:
awk -F: 'commands' input-file
第二種方式是將所有awk命令插入一個(gè)文件,并使awk程序可執(zhí)行,然后用awk命令解釋器作為腳本的首行,以便通過(guò)鍵入腳本名稱(chēng)來(lái)調(diào)用它。
第三種方式是將所有的awk命令插入一個(gè)單獨(dú)文件,然后調(diào)用:
awk -f awk-scrīpt-file input-files(s)
-f選項(xiàng)指明在文件awk_scrīpt_file中的awk腳本,input_file(s)是使用awk進(jìn)行瀏覽的文件名。?
模式和動(dòng)作
任何awk語(yǔ)句都由模式和動(dòng)作組成。在一個(gè)awk腳本中可能有許多語(yǔ)句。模式部分決定動(dòng)作語(yǔ)句何時(shí)觸發(fā)及觸發(fā)事件。處理即對(duì)數(shù)據(jù)進(jìn)行的操作。如果省略模式 部分,動(dòng)作將時(shí)刻保持執(zhí)行狀態(tài)。模式可以是任何條件語(yǔ)句或復(fù)合語(yǔ)句或正則表達(dá)式。模式包括兩個(gè)特殊字段 BEGIN和END。使用BEGIN語(yǔ)句設(shè)置計(jì)數(shù)和打印頭。BEGIN語(yǔ)句使用在任何文本瀏覽動(dòng)作之前,之后文本瀏覽動(dòng)作依據(jù)輸入文本開(kāi)始執(zhí)行。END語(yǔ) 句用來(lái)在awk完成文本瀏覽動(dòng)作后打印輸出文本總數(shù)和結(jié)尾狀態(tài)標(biāo)志。
域和記錄
使用$1,$3表示參照第1和第3域,注意這里用逗號(hào)做域分隔。如果希望打印一個(gè)有5個(gè)域的記錄的所有域,可使用$0,意即所有域。
為打印一個(gè)域或所有域,使用print命令。這是一個(gè)awk動(dòng)作
模式和動(dòng)作
模式:兩個(gè)特殊斷 BEGIN和END
動(dòng)作:實(shí)際動(dòng)作大多在{}內(nèi)指明
輸出
1.抽取域
awk -F: '{print $1}' /etc/passwd
2.保存輸出
awk -F: '{print $1}' /etc/passwd | tee user 使用tee命令,在輸出文件的同時(shí),輸出到屏幕
使用標(biāo)準(zhǔn)輸出
awk -F: '{print $1}' /etc/passwd >user3
4.打印所有記錄
awk -F: '{print $0}' /etc/passwd
5.打印單獨(dú)記錄
awk -F: '{print $1,$4}' /etc/passwd
6.打印報(bào)告頭
awk -F: 'BEGIN {print "NAME\n"} {print $1}' /etc/passwd
7.打印結(jié)尾
awk -F: '{print $1} END {print "this is all users"}' /etc/passwd
條件操作符
1.匹配
awk -F: '{if($1~/root/) print }' /etc/passwd //{if($1~/root/) print}表示如果field1包含root,打印它
2.精確匹配
使用等號(hào) ==
awk -F: '{if($3=="0") print }' /etc/passwd?
3.不匹配
!~
awk -F: '{if($1!~/linuxtone/) print }' /etc/passwd
!=
精確不匹配
awk -F: '{if($1!="linuxtone") print }' /etc/passwd
4.小于
<
5.小于等于
<=
6.大于
>
.........
7.設(shè)置大小寫(xiě)
awk '/[Rr]oot/' /etc/passwd
8.任意字符
awk -F: '{if($1~/^...t/) print}' /etc/passwd //^...t表示第四個(gè)字幕是t
9.或關(guān)系匹配
awk -F: '{if ($1~/(squid|nagios)/) print}' /etc/passwd
10.行首
awk '/^root/' /etc/passwd // ^root(行首包含root)
11.AND &&
awk -F: '{if($1=="root" && $3=="0") print}' /etc/passwd
12.OR ||
內(nèi)置變量:
ARCC 命令行參數(shù)個(gè)數(shù)
ARGV 命令行參數(shù)排列
ENVIRON 支持隊(duì)列中系統(tǒng)環(huán)境變量的使用
FNR 瀏覽文件的記錄數(shù)
FS 置頂分隔符,等價(jià)于-F
NF 瀏覽記錄的域的個(gè)數(shù)
NR 已讀的記錄數(shù)
OFS 輸出域分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符
打印有多少行記錄
awk 'END {print NR}' /etc/passwd
設(shè)置輸入域到變量名
awk -F: '{name=$1; path=$7; if(name~/root/) print name "\tpath is:" path}' /etc/passwd
域值比較操作
awk '{if($6<$7) print $0}' input-file
修改文本域只顯示修改改記錄
awk -F: '{if($1=="nagios") {$1="nagios server" ; print }}' /etc/passwd
文件長(zhǎng)度相加
ls -l|awk '/^[^d]/ {print $9"\t" $5} {tot+=$5} END {print "total kb:"tot}'
內(nèi)置的字符竄函數(shù)
gsub(r,s) 在整個(gè)$0中用s替代r
gsub(r,s,t) 在整個(gè)t中用s替代r
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s長(zhǎng)度
match(s,r) 測(cè)試s中是否包含匹配r的字符串
split(s,a,fs) 在fs上將s分成序列a
sub(s, ) 用$0中最左邊也是最長(zhǎng)的字符串替代
subtr(s,p) 返回字符串s中從p開(kāi)始的后綴部分
substr(s,p,n) 返回字符串s中從p開(kāi)始長(zhǎng)度為n的后綴部分
1.gsub
awk 'gsub(/^root/,"netseek") {print}' /etc/passwd 將與root開(kāi)頭的root替換為netseek
awk 'gsub(/0/,2) {print}' /etc/fstab?
awk '{print gsub(/0/,2) $0}' /etc/fstab?
2.index
awk 'BEGIN {print index("root","o")}' 查詢(xún)字符串root中o出現(xiàn)的第一位置
awk -F: '$1=="root" {print index($1,"o")" "$1}' /etc/passwd
awk -F: '{print index($1,"o") $1}' /etc/passwd
3.length
awk -F: '{print length($1)'} /etc/passwd
awk -F: '$1=="root" {print length($1)}' /etc/passwd
4.match (在ANCD中查找C的位置)
awk 'BEGIN {print match("ANCD",/C/)}'
5.split
返回字符串?dāng)?shù)組元素個(gè)數(shù)
awk 'BEGIN {print split("123#456#789", myarray, "#")}'
6.sub 只能替換指定域的第一個(gè)0
awk 'sub(/0/,2) {print }' /etc/fstab
7.substr?
按照起始位置及長(zhǎng)度返回字符串的一部分
awk 'BEGIN {print substr("www.linuxtone.org",5,9)}' //第5個(gè)字符開(kāi)始,取9個(gè)字符。
awk 'BEGIN {print substr("www.linuxtone.org",5)}' //第5個(gè)位置開(kāi)始,取后面的所有.
字符串屏蔽序列
\b 退格鍵
\f 走紙換頁(yè)
\n 新行
\r 回車(chē)
\t tab
\c 任意其他特殊字符
\ddd 八進(jìn)制
很簡(jiǎn)單的例子
awk -F: '{print $1,"\b"$2,"\t"$3}' /etc/passwd 輸出函數(shù)printf(注意是printf不是print,兩者效果不同的)
printf函數(shù)擁有幾種不同的格式化輸出功能
printf修飾符
- 左對(duì)齊
Width 域的步長(zhǎng)0表示0步長(zhǎng)
.prec 最大字符串長(zhǎng)度,或小數(shù)點(diǎn)右邊的位數(shù)
awk printf格式
%c ASCII字符
%d 整數(shù)
%e 浮點(diǎn)數(shù),科學(xué)計(jì)數(shù)法
%f 浮點(diǎn)數(shù)
%g awk決定使用哪種浮點(diǎn)數(shù)轉(zhuǎn)換,e或者f
%o 八進(jìn)制數(shù)
%s 字符串
%x 十六進(jìn)制數(shù)
1.字符串轉(zhuǎn)換
echo "65" | awk '{printf"%c\n",$0}'
awk 'BEGIN {printf "%c\n",65}'
awk 'BEGIN {printf "%f\n",999}'
2.格式化輸出
awk -F: '{printf "%-15s %s\n",$1,$3}' /etc/passwd
awk -F: 'BEGIN {printf"USER\t\tUID\n"} {printf "%-15s %s\n",$1,$3}' /etc/passwd
3.向一行awk命令傳值
who | awk '{if ($1 == user) print $1 " you are connected to:" $2}' user=$LOGNAME
4.awk腳本文件 (在文件名字后面加后綴.awk方便區(qū)分)
#!/bin/awk -f
BEGIN{
FS=":"
print "User\t\tUID"
print"____________________________"
}
{printf "%-15s %s\n",$1,$3}
END{
print "END"
}
本文轉(zhuǎn)自 mcshell 51CTO博客,原文鏈接:http://blog.51cto.com/mcshell/211440,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的awk应用小结(所有命令行均经调试)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一个小型的网页抓取系统的架构设计
- 下一篇: Linux--轻松定义自己的RPM/DE