目錄
grep
1、什么是grep和rgrep?
2、使用grep
2.1、命令格式
2.2、命令功能
2.3、命令參數(shù)
3、實(shí)戰(zhàn)演示
sed
1、認(rèn)識(shí)sed
2、使用sed
2.1、命令格式
2.2、常用選項(xiàng)options
2.3、地址定界
2.4、編輯命令command
3、sed用法演示
3.1、常用選項(xiàng)用法演示
3.2、sed地址定界演示
3.3、編輯命令command演示
3.4、sed高級(jí)編輯命令
awk
1、認(rèn)識(shí)awk
2、使用awk
2.1、語(yǔ)法
2.2、常用命令選項(xiàng)
3、awk變量
3.1、內(nèi)置變量
3.2、自定義變量
4、printf命令
4.1、格式
4.2演示
5、操作符
5.1、格式
5.3、演示
6、awk PATTERN匹配部分
6.1、格式
6.2、演示
7、awk數(shù)組
7.1、關(guān)聯(lián)數(shù)組:array[index-expression]
7.2、演示
8、awk自定義函數(shù)
8.1、格式
8.2、演示
9、awk中調(diào)用shell命令
9.1、system命令
9.2、awk腳本
9.3、向awk腳本傳遞參數(shù)
10、grep awk sed對(duì)比
awk、grep、sed被稱為L(zhǎng)inux文本三大利器,合稱為文本三劍客,也是必須掌握的Linux命令之一。三者的功能都是處理文本,但側(cè)重點(diǎn)各不相同,其中屬awk功能最強(qiáng)大,但也是最復(fù)雜。grep更適合單純的查找或文本匹配,sed更適合編輯匹配到的文本,awk更適合格式化文本,對(duì)文本進(jìn)行較復(fù)雜格式處理。
grep
1、什么是grep和rgrep?
? ? ? ? ?Linux系統(tǒng)中g(shù)rep命令是一種強(qiáng)大的文本搜索工具,它能使用正則表達(dá)式搜索文本,并把匹配的行打印出來(lái)(匹配到的標(biāo)紅)。grep全稱是Global Regular Expression Print,表示全局正則表達(dá)式版本,它的使用權(quán)限是所有用戶。
? ? ? ? grep的工作方式是這樣的,它在一個(gè)或多個(gè)文件中搜索字符串模板。如果模板包括空格,則必須被引用,模板后的所有字符串被看作文件名。搜索的結(jié)果被送到標(biāo)準(zhǔn)輸出,不影響源原文件內(nèi)容。
? ? ? ? grep可用于shell腳本,因?yàn)間rep通過(guò)返回一個(gè)狀態(tài)值來(lái)說(shuō)明搜索的狀態(tài),如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。我們利用這些返回值就可以進(jìn)行一些自動(dòng)化的文本處理工作。
? ? ? ? egrep = grep -E:擴(kuò)展的正則表達(dá)式(除了<,>,\b使用其他正則都可以去掉\)
2、使用grep
2.1、命令格式
grep [option] pattern file
2.2、命令功能
用于過(guò)濾/搜索的特定字符??墒褂谜齽t表達(dá)式能多種命令配合使用,使用上十分靈活。
2.3、命令參數(shù)
-A<顯示行數(shù)>:除了顯示符合樣式的那一列之外,并顯示該行之后的內(nèi)容
-B<顯示行數(shù)>:除了顯示符合樣式的那一行之外,并顯示該行之前的內(nèi)容
-C<顯示行數(shù)>:除了顯示符合樣式的哪一行之外,并顯示該行之前后的內(nèi)容
-c:統(tǒng)計(jì)匹配的行數(shù)
-e:實(shí)現(xiàn)多個(gè)選項(xiàng)間的邏輯or關(guān)系
-E:擴(kuò)展的正則表達(dá)式
-f FINE:從FILE過(guò)去PARRERN匹配
-F:相當(dāng)于fgrep
-i:--ignore-cas餓#忽略字符大小寫(xiě)的差別
-n:顯示匹配的行號(hào)
-o:僅顯示匹配的字符串
-q:靜默模式,不輸出任何信息
-s:不顯示錯(cuò)誤信息
-v:顯示不被pattern匹配到的行,相當(dāng)于[^]反向匹配
-w:匹配整個(gè)單詞
3、實(shí)戰(zhàn)演示
sed
1、認(rèn)識(shí)sed
? ? ? ? sed是一種流編輯器,它一次處理一行內(nèi)容。處理時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中,成為"模式空間"(patternspace),接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。然后讀入下行,執(zhí)行下一個(gè)循環(huán)。如果沒(méi)有使諸如'D'的特殊命令,那會(huì)在兩個(gè)循環(huán)之間清空模式空間,但不會(huì)清空保留空間。這樣不斷重復(fù),直到文件末尾。文件內(nèi)容并沒(méi)有改變,除非你使用重定向存儲(chǔ)輸出或-i。
? ? ? ? 功能:主要用來(lái)自動(dòng)編輯一個(gè)或多個(gè)文件,簡(jiǎn)化對(duì)文件的反復(fù)操作,替換文件內(nèi)容
2、使用sed
2.1、命令格式
sed [options] '[地址定界] command' file (s)
2.2、常用選項(xiàng)options
-n:不輸出模式空間內(nèi)容到屏幕,即不自動(dòng)打印,只打印匹配到的行
-e:多點(diǎn)編輯,對(duì)每行處理時(shí),可以有多個(gè)script
-f:把script寫(xiě)到文件當(dāng)中,在執(zhí)行sed時(shí)-f指定文件路徑,如果是多個(gè)script,換行寫(xiě)
-r:支持?jǐn)U展的正則表達(dá)式
-i:直接將處理的結(jié)果寫(xiě)入文件
-i.back:在將處理的結(jié)果寫(xiě)入文件之前備份一份
2.3、地址定界
不給地址:對(duì)全文進(jìn)行處理
單地址:
? ? ? ? #:指定的行
? ? ? ? /pattern/:被此處模式所能夠匹配到的每一行
地址范圍:
? ? ? ? #,#
? ? ? ? #,+#
? ? ? ? /part1/,/part2/
? ? ? ? #,/part1/
~:步進(jìn)
? ? ? ? sed -n '1~2p'只打印奇數(shù)行(1~2從第1行,一次加2行)
? ? ? ? sed -n '2~2p'只打印偶數(shù)行
2.4、編輯命令command
d:刪除模式空間匹配的行,并立即啟用下一輪循環(huán)
p:打印當(dāng)前模式空間內(nèi)容,追加到默認(rèn)輸出之后
a:在指定行后面追加文本,支持使用\n實(shí)現(xiàn)多行追加
i:在行前面插入文本,支持使用\n實(shí)現(xiàn)多行追加
c:替換行為單行或多行文本,支持使用\n實(shí)現(xiàn)多行追加
w:保存模式匹配的行至指定文件
r:讀取指定文件的文本至模式空間中匹配到的行后
=:為模式模式空間中的行打印行號(hào)
!:模式空間中匹配行取反處理
s///:查找替換,支持使用其他分隔符,如:s@@@,s###;
? ? ? ? 加g表示行內(nèi)全局替換
? ? ? ? 再替換時(shí),可以加以下命令,實(shí)現(xiàn)大小寫(xiě)轉(zhuǎn)換
? ? ? ? \l:把下一個(gè)字符轉(zhuǎn)換為小寫(xiě)
? ? ? ? \L:它replacement字母轉(zhuǎn)換成小寫(xiě),直到\U或\E出現(xiàn)。
? ? ? ? \u:把下一個(gè)字符換成大寫(xiě)
? ? ? ? \U:把repalcement字母轉(zhuǎn)換成大寫(xiě),直到\L或\E出現(xiàn)。
? ? ? ? \E:停止以\L或\U開(kāi)始的大小寫(xiě)轉(zhuǎn)換
3、sed用法演示
3.1、常用選項(xiàng)用法演示
[root@www test]# cat demo? #查看demo文件中的內(nèi)容
aaa
bbbbb
AABBCCDD
[root@www test]# sed "/aaa/p" demo? #p是除了打印模式空間匹配到的值,還會(huì)將文件中的內(nèi)容追加到模式空間后面
aaa
aaa
bbbbb
AABBCCDD
[root@www test]# sed "/aaabc/p" demo? #模式空間沒(méi)有匹配到需要匹配的值,直接將文件中的內(nèi)容追加到模式空間后面
aaa
bbbbb
AABBCCDD
[root@www test]# sed -n "/aaa/p" demo? #-n與p參數(shù)是對(duì)立的,-n是不輸出模式空間內(nèi)容到屏幕上,且不自動(dòng)打印,只打印匹配到的行;p是打印當(dāng)前模式空間內(nèi)容,且將文本內(nèi)容追加到模式空間之后,因此-n與p發(fā)生沖突,一個(gè)打印一個(gè)不打印,因此這次查詢時(shí)-n起到作用,只打印匹配到的內(nèi)容,注意-n與p必須同時(shí)出現(xiàn),雖然發(fā)生沖突,但是去掉p的話會(huì)出現(xiàn)錯(cuò)誤。
aaa
[root@www test]# sed -e "s/a/A/" -e "s/b/B/" demo #-e是多點(diǎn)編輯,s///是查找替換,也就是s/查找/替換/(只替換一次);此刻的這個(gè)命令是匹配到的第一個(gè)a替換成A,匹配到的第一個(gè)b替換成B
Aaa
Bbbbb
AABBCCDD
[root@www test]# cat sedscript.txt #查看sedscript.txt文件內(nèi)容,文件內(nèi)容是使用sed將A替換成a,且是全局替換,最后有一個(gè)g,g代表的是行內(nèi)全局
s/A/a/g
[root@www test]# sed -f sedscript.txt demo #-f將script寫(xiě)到文件中,在sed時(shí)-f指定文件路徑,就可以將指定文件中的內(nèi)容寫(xiě)到我們需要處理文件當(dāng)中,此命令就是將s/A/a/g寫(xiě)到了demo文件中,就相當(dāng)于以sed "s/A/a/g" demo的命令執(zhí)行了
aaa
bbbbb
aaBBCCDD
[root@www test]# sed -e "s/a/A/g" -e "s/b/B/g" demo #g代表的是行內(nèi)全局替換,通過(guò)一行一行的形式將demo中,所有的a替換成A,b替換成B
AAA
BBBBB
AABBCCDD
[root@www test]# sed -i.bak "s/a/A/g" demo #-i是直接將處理的結(jié)果寫(xiě)入文件,-i.bak是在處理的結(jié)果寫(xiě)入文件之前備份一份,因此下面兩個(gè)文件便是對(duì)比。因?yàn)樵趕ed中不通過(guò)-i是無(wú)法改變?cè)募?nèi)容的,原文件內(nèi)容是不會(huì)發(fā)生變化的。
[root@www test]# cat demo
AAA
bbbbb
AABBCCDD
[root@www test]# cat demo.bak
aaa
bbbbb
AABBCCDD
[root@www test]#
3.2、sed地址定界演示
[root@www test]# sed -n "p" demo #不指定行,打印全文
aaa
bbbbb
AABBCCDD
[root@www test]# sed "2s/b/B/g" demo #將第二行的b替換成B,行內(nèi)全局替換
aaa
BBBBB
AABBCCDD
[root@www test]# sed -n "1,2p" demo #打印1,2行
aaa
bbbbb
[root@www test]# sed -n "/aaa/,/DD/p" demo #從aaa打印到DD
aaa
bbbbb
AABBCCDD
[root@www test]# sed -n "2,/DD/p" demo #從第2行打印到DD
bbbbb
AABBCCDD
[root@www test]# sed "1~2s/[aA]/E/g" demo #將奇數(shù)行的a或A替換成E,1~2代表的是奇數(shù)行
EEE
bbbbb
EEBBCCDD
3.3、編輯命令command演示
[root@www test]# sed "2d" demo #刪除第2行
aaa
AABBCCDD
[root@www test]# sed -n "2p" demo #打印第二行
bbbbb
[root@www test]# sed "2a123" demo #a代表在指定行后面追加文本,支持使用\n實(shí)現(xiàn)多行追加;2a是在第二行后面追加文本,將123追加在第二行的后面,追加后的文本會(huì)以\n實(shí)現(xiàn)多行追加
aaa
bbbbb
123
AABBCCDD
[root@www test]# sed "1i123" demo #i代表在行前面插入文本,支持使用\n實(shí)現(xiàn)多行追加;1i是在第一行前面追加文本,將123追加在第一行的前面,追加后的文本會(huì)以\n實(shí)現(xiàn)多行追加
123
aaa
bbbbb
AABBCCDD
[root@www test]# sed "3c123\n456" demo #c代表替換行為單行或多行文本,支持使用\n實(shí)現(xiàn)多行追加;3c是將三行替換為123,換行,在追加456
aaa
bbbbb
123
456
[root@www test]# sed -n "3w/root/test/demo3" demo #w代表保存模式匹配的行至指定文件;3w表示將第三行的內(nèi)同保存到demo3當(dāng)中。注意需要使用絕對(duì)路徑
[root@www test]# cat demo3 #查看demo3中的內(nèi)容,果真將demo中的第三行內(nèi)容保存到了demo3當(dāng)中
AABBCCDD
[root@www test]# sed "1r/root/test/demo3" demo #r代表讀取指定文件的文本至模式空間中匹配的行后;1r代表讀取demo3中的內(nèi)容到第一行后
aaa
AABBCCDD
bbbbb
AABBCCDD
[root@www test]# sed -n "=" demo #=代表是模式空間中的行打印行號(hào),也就是說(shuō)是打印行號(hào)
1
2
3
[root@www test]# sed -n '2!p' demo #代表是打印除了第2行的內(nèi)容
aaa
AABBCCDD
[root@www test]# sed 's@[a-z]@\u&@g' demo #將全文的小寫(xiě)字母替換為大寫(xiě)字母
AAA
BBBBB
AABBCCDD
3.4、sed高級(jí)編輯命令
3.4.1、格式
h:把模式空間中的內(nèi)容覆蓋至保持空間中
H:把模式空間中的內(nèi)容追加至保持空間中
g:從保持空間取出數(shù)據(jù)覆蓋至模式空間
G:從保持空間取出內(nèi)容追加至模式空間
?x:把模式空間中的內(nèi)容與保持空間中的內(nèi)容進(jìn)行互換
n:讀取匹配到的行的下一行覆蓋至模式空間
N:讀取匹配到的行的下一行追加至模式空間
d:刪除模式空間中的行
D:刪除當(dāng)前模式空間開(kāi)端至\n的內(nèi)容(不在傳至標(biāo)準(zhǔn)輸出),放棄之后的命令,但是對(duì)剩余模式空間重新執(zhí)行sed
3.4.2、一個(gè)案例和示意圖演示
案例:倒敘輸出文本內(nèi)容
[root@www test]# cat num
One
Two
Three
[root@www test]# sed '1!G;h;$!d' num #1!G代表第一行不執(zhí)行G命令,從第二行開(kāi)始執(zhí)行;$!d代表最后一行不刪除
Three
Two
One
總結(jié)模式空間與保持空間 與保持空間關(guān)系
保持空間是模式空間一個(gè)臨時(shí)存放數(shù)據(jù)的緩沖區(qū),協(xié)助模式空間進(jìn)行數(shù)據(jù)處理
awk
1、認(rèn)識(shí)awk
????????awk是一種編程語(yǔ)言,用于在Linux/unix下對(duì)文本和數(shù)據(jù)進(jìn)行處理。數(shù)據(jù)可以來(lái)自標(biāo)準(zhǔn)輸入(stdin)、一個(gè)或多個(gè)文件,或其它命令的輸出。它支持用戶自定義函數(shù)和動(dòng)態(tài)正則表達(dá)式等先進(jìn)功能,是Linux/unix下的一個(gè)強(qiáng)大編程工具。它在命令行中使用,但更多是作為腳本來(lái)使用。awk有很多內(nèi)建的功能,比如數(shù)組、函數(shù)等,這是它和C語(yǔ)言的相同之處,靈活性是awk最大的優(yōu)勢(shì)。
? ? ? ? awk其實(shí)不僅僅是工具軟件,還是一種編程語(yǔ)言。只不過(guò),文本只介紹它的命令行用法,對(duì)于大多數(shù)場(chǎng)合,應(yīng)該足夠用了。
2、使用awk
2.1、語(yǔ)法
awk` `[options] ``'program'` `var=value ``file``…``awk` `[options] -f programfile var=value ``file``…``awk` `[options] ``'BEGIN{ action;… } pattern{ action;… } END{ action;… }'` `file` `...
2.2、常用命令選項(xiàng)
-F fs:fs指定輸入分隔符,fs可以是字符串或正則表達(dá)式
-v var=value:賦值一個(gè)用戶定義變量,將外部變量傳給awk
-f scriptfile:從腳本文件中讀取awk命令
3、awk變量
變量:內(nèi)置和自定義變量,每個(gè)變量前加-v命令選項(xiàng)
3.1、內(nèi)置變量
3.1.1、格式
FS: 輸入字段分隔符,默認(rèn)為空白字符
OFS:輸出字段分隔符,默認(rèn)為空白字符
RS:輸入記錄分隔符,指定輸入時(shí)的換行符,原換行符仍有效
ORS:輸出記錄分隔符,輸出時(shí)用指定符號(hào)代替換行符
NF:字段數(shù)量,共有多少字段,$NF引用最后一列,$(NF-1)引用倒數(shù)第2列
NR:行號(hào),后可跟多個(gè)文件,第二個(gè)文件行號(hào)繼續(xù)從第一個(gè)文件最后行號(hào)開(kāi)始
FNR:各文件分別計(jì)數(shù),行號(hào),后跟一個(gè)文件和NR一樣,跟多個(gè)文件,第二個(gè)文件行號(hào)從1開(kāi)始
FILEANAME:當(dāng)前文件名
ARGC:命令行參數(shù)的個(gè)數(shù)
ARGV:數(shù)組,保存的是命令行所給定的各參數(shù),查看參數(shù)
3.1.2、演示
[root@www test]# cat awkdemo #查看awkdemo文件的內(nèi)容
hello:world
linux:redhat:lalala:hahaha
along:love:youou
[root@www test]# awk -v FS=':' '{print $1,$2}' awkdemo #-v是賦值一個(gè)用戶定義變量,將外部變量傳遞給awk;FS是輸入字段分隔符,此時(shí)的分割符為":"。此時(shí)輸出字段分隔符沒(méi)有被設(shè)置,因此是以默認(rèn)空格為輸出字符。打印文本第一列與第二列的內(nèi)容。
hello world
linux redhat
along love
[root@www test]# awk -v FS=':' -v OFS='---' '{print $1,$2}' awkdemo #FS指定輸入字段分隔符被設(shè)置為":" ,OFS指定輸出字段分隔符被設(shè)置為"---"
hello---world
linux---redhat
along---love
[root@www test]# awk -v RS=':' '{print $1, $2}' awkdemo #RS是輸入記錄分隔符,指定輸入時(shí)的換行符,換行符仍有效。意思就是說(shuō)將文件中的":"看作為換行符,只要是碰見(jiàn)":"將當(dāng)作換行符使用,原本的換行符仍然起作用
hello
world linux
redhat
lalala
hahaha along
love
youou
[root@www test]# awk -v FS=':' -v ORS='---' '{print $1,$2}' awkdemo #ORS是輸出記錄分隔符,輸出時(shí)用指定符號(hào)代替換行符;只將第一列與第二列打印出來(lái),換行符替換成了"---"
hello world---linux redhat---along love---
[root@www test]# awk -F: '{print NF}' awkdemo #NF是指字段數(shù)量,共有多少字段
2
4
3
[root@www test]# awk -F: '{print $(NF-1)}' awkdemo #$NF代表引用最后一列,$(NF-1)代表引用倒數(shù)第二列
hello
lalala
love
[root@www test]# cat awkdemo1
hello:world
linux:redhat:lalala:hahaha
along:love:youou
[root@www test]# awk '{print NR}' awkdemo awkdemo1 #NR代表行號(hào),后面可以跟多個(gè)文件,第二個(gè)文件行號(hào)繼續(xù)從第一個(gè)文件最后的行號(hào)開(kāi)始
1
2
3
4
5
6
[root@www test]# awk END'{print NR}' awkdemo awkdemo1 #END打印最后一行的行號(hào)
6
[root@www test]# awk '{print FNR}' awkdemo awkdemo1 #FNR代表個(gè)文件分別計(jì)數(shù),行號(hào),后跟一個(gè)文件和NR一樣,跟多個(gè)文件,第二個(gè)文件行號(hào)從1開(kāi)始
1
2
3
1
2
3
[root@www test]# awk '{print FILENAME}' awkdemo #FILENAME代表時(shí)當(dāng)前文件的文件名
awkdemo
awkdemo
awkdemo
[root@www test]# awk 'BEGIN {print ARGC}' awkdemo awkdemo1 #ARGC代表的是命令行參數(shù)的個(gè)數(shù),其中三個(gè)參數(shù)分別是awk,awkdemo,awkdemo1
3
[root@www test]# awk 'BEGIN {print ARGV[0]}' awkdemo awkdemo1 #ARGV代表的是將命令行中的參數(shù)以數(shù)組的形式,可以進(jìn)行查看,此時(shí)是查看第一個(gè)參數(shù)。
awk
[root@www test]# awk 'BEGIN {print ARGV[1]}' awkdemo awkdemo1
awkdemo
[root@www test]# awk 'BEGIN {print ARGV[2]}' awkdemo awkdemo1
awkdemo1
3.2、自定義變量
自定義變量(區(qū)分字符大小寫(xiě))
3.2.1、-v var=value
①先定義變量,后執(zhí)行動(dòng)作print
[root@www test]# awk -v name="along" -F: '{print name":"$0}' awkdemo
along:hello:world
along:linux:redhat:lalala:hahaha
along:along:love:youou
②在執(zhí)行動(dòng)作print后定義變量
[root@www test]# awk -F: '{print name":"$0;name="along"}' awkdemo #第一行為什么沒(méi)有變量名呢,原因是awk是以行來(lái)運(yùn)行的,命令在運(yùn)行第一行時(shí),變量名此時(shí)還沒(méi)有被聲明,因此第一行沒(méi)有變量名
:hello:world
along:linux:redhat:lalala:hahaha
along:along:love:youou
3.2.2、在progarm中直接定義
可以把執(zhí)行的動(dòng)作放在腳本中,直接調(diào)回腳本-f
[root@www test]# awk -F: -f awk.txt awkdemo
along hello
along linux
along along
4、printf命令
比print更強(qiáng)大
4.1、格式
4.1.1、格式化輸出
printf` `"FORMAT"``, item1,item2, ...
①必須指定FORMAT
②不會(huì)自動(dòng)換行,需要顯示給出換行控制符,\n
③FORMAT中需要分別給后面每個(gè)item指定格式符
4.1.2格式符:與item一一對(duì)應(yīng)
%c:顯示字符的ASCⅡ碼
%d,%i:顯示十進(jìn)制整數(shù)
%e,%E:顯示科學(xué)計(jì)數(shù)法數(shù)值
%f:顯示為浮點(diǎn)數(shù),小數(shù);%5.1f,帶整數(shù)、小數(shù)點(diǎn)、整數(shù)共5位,小數(shù)1位,不夠用空格補(bǔ)上
%g,%G:以科學(xué)計(jì)數(shù)法過(guò)浮點(diǎn)形式顯示數(shù)值
%s:顯示字符串;例:%5s最少5個(gè)字符,不夠用空格補(bǔ)上,超過(guò)5個(gè)還繼續(xù)顯示
%u:無(wú)符號(hào)整數(shù)
%%:顯示%自身
4.1.3修飾符:放在%c[/d/e/f...]之間
#[.#]:第一個(gè)數(shù)字控制顯示的寬度;第二個(gè)#表示小數(shù)點(diǎn)后精度,%5.1f
-:左對(duì)齊(默認(rèn)右對(duì)齊)%-15s
+:顯示數(shù)值的正負(fù)符號(hào)%+d
4.2演示
[root@www test]# awk -F: '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
[root@www test]# awk -F: '{printf "%20s---%u\n",$1,$3}' /etc/passwd #打印第一行顯示小于20的字符串;第2列顯示整數(shù)并換行(右對(duì)齊)
root---0
bin---1
daemon---2
adm---3
lp---4
[root@www test]# awk -F: '{printf "%-20s---%-10.3f\n",$1,$3}' /etc/passwd #使用-進(jìn)行左對(duì)齊;第二列顯示浮點(diǎn)數(shù)
root ---0.000
bin ---1.000
daemon ---2.000
adm ---3.000
lp ---4.000
[root@www test]# awk -F: 'BEGIN{printf "username userid\n-----------------------------\n"}{printf "%-20s|%-10.3f\n",$1,$3}' /etc/passwd #使用printf做表格
username userid
-----------------------------
root |0.000
bin |1.000
daemon |2.000
adm |3.000
lp |4.000
5、操作符
5.1、格式
? ? ? ? x+y,x-y,x*y,x^y,x%y
? ? ? ? -x:轉(zhuǎn)換為負(fù)數(shù)
? ? ? ? +x:轉(zhuǎn)換為數(shù)值
字符串操作符:沒(méi)有符號(hào)的操作符,字符串連接
賦值操作符:
? ? ? ? =,+=,-=,*=,%=,^=
? ? ? ? ++,--
比較操作符:
? ? ? ? ==,!=,>,>=,<,<=
模式匹配符:~:左邊是否和右邊匹配包含!~:是否不匹配
邏輯操作符:與&&,或||,非!
函數(shù)調(diào)用:function_name(argu1,argu2,...)
條件表達(dá)式(三目運(yùn)算符):selector?if-ture-expression:if-false-expression
? ? ? ? 注釋:先判斷selector,如果符合執(zhí)行?后的操作:否則執(zhí)行:后的操作
5.3、演示
①模式匹配符
[root@www test]# df -h | awk -F: '$0 ~ /^\/dev/' #查詢以/dev開(kāi)頭的磁盤(pán)信息
/dev/mapper/centos-root 36G 8.7G 28G 25% /
/dev/sda1 1014M 171M 844M 17% /boot
[root@www test]# df -h | awk '$0 ~ /^\/dev/{print $(NF-1)}"---"$1' #只顯示磁盤(pán)使用狀況和磁盤(pán)名
Filesystem Size Used Avail Use% Mounted on
25%
/dev/mapper/centos-root 36G 8.7G 28G 25% /
devtmpfs 1.4G 0 1.4G 0% /dev
tmpfs 1.4G 0 1.4G 0% /dev/shm
tmpfs 1.4G 12M 1.4G 1% /run
tmpfs 1.4G 0 1.4G 0% /sys/fs/cgroup
17%
/dev/sda1 1014M 171M 844M 17% /boot
tmpfs 280M 12K 280M 1% /run/user/42
tmpfs 280M 0 280M 0% /run/user/0
[root@www test]# df -h | awk '$0 ~ /^\/dev/{print $(NF-1)"---"$1}' |awk -F% '$1 > 20' #查找磁盤(pán)大于20%的
25%---/dev/mapper/centos-root
②邏輯操作符
[root@www test]# awk -F: '$3>=0 && $3<=100 {print $1,$3}' /etc/passwd
#查詢第三列大于等于三,小于等于一百的,并且打印第一列和第三列
root 0
bin 1
daemon 2
adm 3
lp 4
[root@www test]# awk -F: '$3==0 || $3>=1000{print $1}' /etc/passwd #查詢第三列為0或第三列大于等于1000,滿足前面的的兩個(gè)條件,則直接打印第一列
root
nfsnobody
centos
[root@www test]# awk -F: '!($3==0){print $1}' /etc/passwd
bin
[root@www test]# awk -F: '!($0 ~ /bash$/) {print $1,$3}' /etc/passwd
bin 1
daemon 2
adm 3
lp 4
③條件表達(dá)式(三目表達(dá)式)
[root@www test]# awk -F: '{$3 >= 1000?usrtype="common user":usertype="sysadmin user";print usertype,$1,$3}' /etc/passwd
sysadmin user root 0
sysadmin user bin 1
sysadmin user daemon 2
sysadmin user adm 3
sysadmin user lp 4
6、awk PATTERN匹配部分
6.1、格式
PATTERN:根據(jù)pattern條件,過(guò)濾匹配的行,在做處理
(1)如果未指定:空模式,匹配每一行
(2)/regular expression/:僅處理能夠模式匹配到的行,正則,需要用//括起來(lái)
(3)relational expression:關(guān)系表達(dá)式,結(jié)果為"真"才會(huì)被處理
真:結(jié)果為非0值,非空字符串
假:結(jié)果為空字符串或0值
(4)line ranges:行范圍
? ? ? ? startline(起始行),endline(結(jié)束行):/part1/,/part2/不支持直接給出數(shù)字,可以有多段,中間可以有間隔
(5)BEGIN/END模式
? ? ? ? BEGIN{}:僅在開(kāi)始處理文件中的文本之前執(zhí)行一次
? ? ? ? END{}:僅在文本處理完成之后執(zhí)行
6.2、演示
[root@www test]# awk -F: '{print $1}' awkdemo
hello
linux
along
[root@www test]# awk -F: '/along/{print $1}' awkdemo
along
[root@www test]# awk -F: '1{print $1}' awkdemo
hello
linux
along
[root@www test]# awk -F: '0{print $1}' awkdemo
[root@www test]# awk -F: '/^h/,/^a/{print $1}' awkdemo
hello
linux
along
[root@www test]# awk -F: 'BEGIN{print "第一列"}{print $1} END{print "結(jié)束"}' awkdemo
第一列
hello
linux
along
結(jié)束
7、awk數(shù)組
7.1、關(guān)聯(lián)數(shù)組:array[index-expression]
(1)可使用任意字符串;字符串要使用雙引號(hào)括起來(lái)
(2)如果某數(shù)組元素事先不存在,在引用時(shí),awk會(huì)自動(dòng)創(chuàng)建此元素,并將其值初始化為"空串"
(3)若要判斷數(shù)組中是否存在某元素,要使用"index in array"格式進(jìn)行遍歷
(4)若要遍歷數(shù)組中的每個(gè)元素,要使用for循環(huán):for(var in array){for-body}
7.2、演示
[root@www test]# cat awkdemo2 #查看awkdemo2文件中的內(nèi)容
aaa
bbbb
aaa
123
123
123
[root@www test]# awk '!arr[$0]++' awkdemo2 #去除重復(fù)的行;awkdemo2中的內(nèi)容在arr[]數(shù)組中都是鍵名,aaa第一次進(jìn)入數(shù)組中是沒(méi)有值的,所以第一次arr為0,取反之后arr為1,在awk中,只有為真的時(shí)候才會(huì)打印輸出,因此第一次打印出aaa;第二次是bbbb,當(dāng)bbbb進(jìn)入arr數(shù)組中,因?yàn)槭堑谝淮芜M(jìn)入所以也是0,取反之后為1,輸出bbb;第三次是aaa再次進(jìn)入數(shù)組中,此時(shí)$0為1,取反之后就為0,因此沒(méi)有打印處理啊;第四次是123第一次進(jìn)入數(shù)組,沒(méi)有值因此也是0,在取反之后為1,所以輸出打?。坏谖宕问?23,此時(shí)$0為2,取反為0,因此不輸出;第六次是123,此時(shí)$0為1,取反為0,也不輸出。
aaa
bbbb
123
[root@www test]# awk '{!arr[$0]++;print $0,arr[$0]}' awkdemo2 #打印文件內(nèi)容,和該行重復(fù)第幾次出現(xiàn)
aaa 1
bbbb 1
aaa 2
123 1
123 2
123 3
8、awk自定義函數(shù)
8.1、格式
和bash區(qū)別:定義函數(shù)()中需加參數(shù),return返回值不是$?,是相當(dāng)于echo輸出
function name ( parameter, parameter, ... ) {
statements
return expression
}
8.2、演示
[root@along ~]# cat fun.awk
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
BEGIN{a=3;b=2;print max(a,b)}
[root@along ~]# awk -f fun.awk
3
9、awk中調(diào)用shell命令
9.1、system命令
? ? ? ? 空格是awk中的字符串連接符,如果system中需要使用awk中的變量可以使用空格分隔,或者說(shuō)除了awk的變量外其他一律""引用起來(lái)。
[root@along ~]# awk BEGIN'{system("hostname") }'
along
[root@along ~]# awk 'BEGIN{name="along";system("echo "name)}' 注:"echo " echo后有空格
along
[root@along ~]# awk 'BEGIN{score=100; system("echo your score is " score) }'
your score is 100
9.2、awk腳本
將awk程序?qū)懗赡_本,直接調(diào)用或執(zhí)行
示例:
[root@along ~]# cat f1.awk
{if($3>=1000)print $1,$3}
[root@along ~]# cat f2.awk
#!/bin/awk -f
{if($3 >= 1000)print $1,$3}
[root@along ~]# chmod +x f2.awk
[root@along ~]# ./f2.awk -F: /etc/passwd
along 1000
9.3、向awk腳本傳遞參數(shù)
①格式:
awkfile var=value var2=value2... Inputfile
注意:在BEGIN過(guò)程中不可用。直到首行輸入完成以后,變量才可用。可以通過(guò)-v參數(shù),讓awk在執(zhí)行BEGIN之前得到變量的值。命令行中每一個(gè)指定的變量都需要一個(gè)-v
②示例
[root@along ~]# cat test.awk
#!/bin/awk -f
{if($3 >=min && $3<=max)print $1,$3}
[root@along ~]# chmod +x test.awk
[root@along ~]# ./test.awk -F: min=100 max=200 /etc/passwd
systemd-network 192
10、grep awk sed對(duì)比
grep 主要用于搜索某些字符串;
sed,awk 用于處理文本 ;
grep基本是以行為單位處理文本的**; 而awk可以做更細(xì)分的處理,通過(guò)指定分隔符將一行(一條記錄)劃分為多個(gè)字段,以字段為單位處理文本。**awk中支持C語(yǔ)法,可以有分支條件判斷、循環(huán)語(yǔ)句等,相當(dāng)于一個(gè)小型編程語(yǔ)言。
awk功能比較多是一個(gè)編程語(yǔ)言了。 grep功能簡(jiǎn)單,就是一個(gè)簡(jiǎn)單的正則表達(dá)式的匹配。 awk的功能依賴于grep。
grep可以理解為主要作用是在一個(gè)文件中查找過(guò)濾需要的內(nèi)容。awk不是過(guò)濾查找,而是文本處理工具,是把一個(gè)文件處理成你想要的格式。
AWK的功能是什么?與sed和grep很相似,awk是一種樣式掃描與處理工具。但其功能卻大大強(qiáng)于sed和grep。awk提供了極其強(qiáng)大的功能:它幾乎可以完成grep和sed所能完成的全部工作,同時(shí),它還可以可以進(jìn)行樣式裝入、流控制、數(shù)學(xué)運(yùn)算符、進(jìn)程控制語(yǔ)句甚至于內(nèi)置的變量和函數(shù)。它具備了一個(gè)完整的語(yǔ)言所應(yīng)具有的幾乎所有精美特性。實(shí)際上,awk的確擁有自己的語(yǔ)言:awk程序設(shè)計(jì)語(yǔ)言,awk的三位創(chuàng)建者已將它正式定義為:樣式掃描和處理語(yǔ)言。 使用awk的第一個(gè)理由是基于文本的樣式掃描和處理是我們經(jīng)常做的工作,awk所做的工作有些象數(shù)據(jù)庫(kù),但與數(shù)據(jù)庫(kù)不同的是,它處理的是文本文件,這些文件沒(méi)有專門(mén)的存儲(chǔ)格式,普通的人們就能編輯、閱讀、理解和處理它們。而數(shù)據(jù)庫(kù)文件往往具有特殊的存儲(chǔ)格式,這使得它們必須用數(shù)據(jù)庫(kù)處理程序來(lái)處理它們。既然這種類似于數(shù)據(jù)庫(kù)的處理工作我們經(jīng)常會(huì)遇到,我們就應(yīng)當(dāng)找到處理它們的簡(jiǎn)便易行的方法,UNIX有很多這方面的工具,例如sed 、grep、sort以及find等等,awk是其中十分優(yōu)秀的一種。
使用awk的第二個(gè)理由是awk是一個(gè)簡(jiǎn)單的工具,當(dāng)然這是相對(duì)于其強(qiáng)大的功能來(lái)說(shuō)的。的確,UNIX有許多優(yōu)秀的工具,例如UNIX天然的開(kāi)發(fā)工具C語(yǔ)言及其延續(xù)C++就非常的優(yōu)秀。但相對(duì)于它們來(lái)說(shuō),awk完成同樣的功能要方便和簡(jiǎn)捷得多。這首先是因?yàn)閍wk提供了適應(yīng)多種需要的解決方案:從解決簡(jiǎn)單問(wèn)題的awk命令行到復(fù)雜而精巧的awk程序設(shè)計(jì)語(yǔ)言,這樣做的好處是,你可以不必用復(fù)雜的方法去解決本來(lái)很簡(jiǎn)單的問(wèn)題。例如,你可以用一個(gè)命令行解決簡(jiǎn)單的問(wèn)題,而C不行,即使一個(gè)再簡(jiǎn)單的程序,C語(yǔ)言也必須經(jīng)過(guò)編寫(xiě)、編譯的全過(guò)程。其次,awk本身是解釋執(zhí)行的,這就使得awk程序不必經(jīng)過(guò)編譯的過(guò)程,同時(shí),這也使得它與shell script程序能夠很好的契合。最后,awk本身較C語(yǔ)言簡(jiǎn)單,雖然awk吸收了C語(yǔ)言很多優(yōu)秀的成分,熟悉C語(yǔ)言會(huì)對(duì)學(xué)習(xí)awk有很大的幫助,但awk本身不須要會(huì)使用C語(yǔ)言——一種功能強(qiáng)大但需要大量時(shí)間學(xué)習(xí)才能掌握其技巧的開(kāi)發(fā)工具。
使用awk的第三個(gè)理由是awk是一個(gè)容易獲得的工具。與C和C++語(yǔ)言不同,awk只有一個(gè)文件(/bin/awk),而且?guī)缀趺總€(gè)版本的UNIX都提供各自版本的awk,你完全不必費(fèi)心去想如何獲得awk。但C語(yǔ)言卻不是這樣,雖然C語(yǔ)言是UNIX天然的開(kāi)發(fā)工具,但這個(gè)開(kāi)發(fā)工具卻是單獨(dú)發(fā)行的,換言之,你必須為你的UNIX版本的C語(yǔ)言開(kāi)發(fā)工具單獨(dú)付費(fèi)(當(dāng)然使用D版者除外),獲得并安裝它,然后你才可以使用它。
基于以上理由,再加上awk強(qiáng)大的功能,我們有理由說(shuō),如果你要處理與文本樣式掃描相關(guān)的工作,awk應(yīng)該是你的第一選擇。在這里有一個(gè)可遵循的一般原則:如果你用普通的shell工具或shell script有困難的話,試試awk,如果awk仍不能解決問(wèn)題,則便用C語(yǔ)言,如果C語(yǔ)言仍然失敗,則移至C++。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-771896.html
sed是一個(gè)非交互性文本流編輯器。它編輯文件或標(biāo)準(zhǔn)輸入導(dǎo)出的文本拷貝。sed編輯器按照一次處理 一行的方式來(lái)處理文件(或者輸入)并把輸出送到屏幕上。你可以在vi和ex/ed編輯器里識(shí)別他的命令。sed把當(dāng)前正在處理的行保存在一個(gè)臨時(shí)緩存里,這個(gè)緩存叫做模式空間。一但sed完成了對(duì)模式空間里的行的處理(即對(duì)該行執(zhí)行sed命令),就把模式空間的行送到屏幕上(除非該命令要?jiǎng)h除該行活禁止打?。L幚硗暝撔兄?,從模式空間里刪除它,然后把下一行讀入模式空間,進(jìn)行處理,并顯示。當(dāng)輸入文件的最后一行處理完后,sed終止。通過(guò)把每一行存在一個(gè)臨時(shí)緩存里并編輯該行,初始文件不會(huì)被修改或被破壞。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-771896.html
到了這里,關(guān)于Linux文本三劍客(grep、sed、awk)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!