转:shell awk
簡(jiǎn)單使用:
awk :對(duì)于文件中一行行的獨(dú)處來(lái)執(zhí)行操作 。
awk -F :'{print $1,$4}' :使用‘:’來(lái)分割這一行,把這一行的第一第四個(gè)域打印出來(lái) 。
?
?
詳細(xì)介紹:
AWK命令介紹
?
awk語(yǔ)言的最基本功能是在文件或字符串中基于指定規(guī)則瀏覽和抽取信息,awk抽取信息后,才能進(jìn)行其他文本操作,完整的awk腳本通常用來(lái)格式化文本文件中的信息
?
1. 調(diào)用awk:
?
第一種命令行方式,如:
?
awk[-Field-separator]'commands'input-file(s)
?
這里commands是真正的awk命令,[-F域分隔符]是可選的,awk默認(rèn)使用空格分隔,因此如果要瀏覽域間有空格的文本,不必指定這個(gè)選項(xiàng),但如果瀏覽如passwd文件,此文件各域使用冒號(hào)作為分隔符,則必須使用-F選項(xiàng): awk -F : 'commands' input-file
?
第二種,將所有awk命令插入一個(gè)文件,并使awk程序可執(zhí)行,然后用awk命令解釋器作為腳本的首行,以便通過(guò)鍵入腳本名稱來(lái)調(diào)用它
?
第三種,將所有awk命令插入一個(gè)單獨(dú)文件,然后調(diào)用,如:
?
awk-fawk-script-fileinput-file
?
-f選項(xiàng)指明在文件awk-script-file的awk腳本,input-file是使用awk進(jìn)行瀏覽的文件名
?
2. awk腳本:
?
awk腳本由各種操作和模式組成,根據(jù)分隔符(-F選項(xiàng)),默認(rèn)為空格,讀取的內(nèi)容依次放置到對(duì)應(yīng)的域中,一行一行記錄讀取,直到文件尾
?
2.1. 模式和動(dòng)作
?
任何awk語(yǔ)句都是由模式和動(dòng)作組成,在一個(gè)awk腳本中可能有許多語(yǔ)句。模式部分決定動(dòng)作語(yǔ)句何時(shí)觸發(fā)及觸發(fā)事件。動(dòng)作即對(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)志,有動(dòng)作必須使用{}括起來(lái)
?
實(shí)際動(dòng)作在大括號(hào){}內(nèi)指明,常用來(lái)做打印動(dòng)作,但是還有更長(zhǎng)的代碼如if和循環(huán)looping語(yǔ)句及循環(huán)退出等,如果不指明采取什么動(dòng)作,awk默認(rèn)打印出所有瀏覽出的記錄
?
2.2. 域和記錄:
?
awk執(zhí)行時(shí),其瀏覽標(biāo)記為$1,$2...$n,這種方法稱為域標(biāo)記。使用$1,$3表示參照第1和第3域,注意這里使用逗號(hào)分隔域,使用$0表示使用所有域。例如:
?
awk '{print $0}' temp.txt > sav.txt
?
表示打印所有域并把結(jié)果重定向到sav.txt中
?
awk '{print $0}' temp.txt|tee sav.txt
?
和上例相似,不同的是將在屏幕上顯示出來(lái)
?
awk '{print $1,$4}' temp.txt
?
只打印出第1和第4域
?
awk 'BEGIN {print "NAME GRADE\n----"} {print $1"\t"$4}' temp.txt
?
表示打信息頭,即輸入的內(nèi)容的第一行前加上"NAME GRADE\n-------------",同時(shí)內(nèi)容以tab分開(kāi)
?
awk 'BEGIN {print "being"} {print $1} END {print "end"}' temp
?
同時(shí)打印信息頭和信息尾
?
2.3. 條件操作符:
?
<、<=、==、!=、>=、~匹配正則表達(dá)式、!~不匹配正則表達(dá)式
?
匹配:awk '{if ($4~/ASIMA/) print $0}' temp 表示如果第四個(gè)域包含ASIMA,就打印整條
?
精確匹配:awk '$3=="48" {print $0}' temp 只打印第3域等于"48"的記錄
?
不匹配: awk '$0 !~ /ASIMA/' temp 打印整條不包含ASIMA的記錄
?
不等于: awk '$1 != "asima"' temp
?
小于: awk '{if ($1<$2) print $1 "is smaller"}' temp
?
設(shè)置大小寫(xiě): awk '/[Gg]reen/' temp打印整條包含Green,或者green的記錄
?
任意字符: awk '$1 ~/^...a/' temp打印第1域中第四個(gè)字符是a的記錄,符號(hào)’^’代表行首,符合’.’代表任意字符
?
或關(guān)系匹配: awk '$0~/(abc)|(efg)/' temp 使用|時(shí),語(yǔ)句需要括起來(lái)
?
AND與關(guān)系: awk '{if ( $1=="a" && $2=="b" ) print $0}' temp
?
OR或關(guān)系: awk '{if ($1=="a" || $1=="b") print $0}' temp
?
2.4. awk內(nèi)置變量:
?
| ARGC | 命令行參數(shù)個(gè)數(shù) | NF | 瀏覽記錄的域個(gè)數(shù) |
| AGRV | 命令行參數(shù)排列 | NR | 已讀的記錄數(shù) |
| ENVIRON | 支持隊(duì)列中系統(tǒng)環(huán)境變量的使用 | OFS | 輸出域分隔符 |
| FILENAME | awk瀏覽的文件名 | ORS | 輸出記錄分隔符 |
| FNR | 瀏覽文件的記錄數(shù) | RS | 控制記錄分隔符 |
| FS | 設(shè)置輸入域分隔符,同- F選項(xiàng) | NF | 瀏覽記錄的域個(gè)數(shù) |
?
例:awk'END{print NR}' temp在最后打印已讀記錄條數(shù)
?
awk '{print NF,NR,$0} END {print FILENAME}' temp
?
awk '{if (NR>0 && $4~/Brown/) print $0}' temp 至少存在一條記錄且包含Brown
?
NF的另一用法: echo $PWD | awk -F/ '{print $NF}' 顯示當(dāng)前目錄名
轉(zhuǎn)載于:https://www.cnblogs.com/yangchunli/p/7132787.html
總結(jié)
以上是生活随笔為你收集整理的转:shell awk的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 我的AutoHotkey配置
- 下一篇: 怎么将PDF文件在线转换成JPG图片