溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux中awk語(yǔ)法怎么使用

發(fā)布時(shí)間:2021-12-20 09:38:00 來(lái)源:億速云 閱讀:159 作者:iii 欄目:網(wǎng)絡(luò)管理

本篇內(nèi)容介紹了“Linux中awk語(yǔ)法怎么使用”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

awk簡(jiǎn)介與表達(dá)式實(shí)例

  • 一種名字怪異的語(yǔ)言

  • 模式掃描和處理,處理數(shù)據(jù)和生成報(bào)告。

awk不僅僅是linux系統(tǒng)中的一個(gè)命令,而且是一種編程語(yǔ)言;它可以用來(lái)處理數(shù)據(jù)和生成報(bào)告(excel);處理的數(shù)據(jù)可以是一個(gè)或多個(gè)文件;可以是直接來(lái)自標(biāo)準(zhǔn)輸入,也可以通過(guò)管道獲取標(biāo)準(zhǔn)輸入;awk可以在命令行上直接編輯命令進(jìn)行操作,也可以編寫成awk程序來(lái)進(jìn)行更為復(fù)雜的運(yùn)用。

sed處理stream editor文本流,水流。

一、awk環(huán)境簡(jiǎn)介

本文涉及的awk為gawk,即GNU版本的awk。

[root@creditease awk]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@creditease awk]# uname -r
3.10.0-862.el7.x86_64
[root@creditease awk]# ll `which awk`
lrwxrwxrwx. 1 root root 4 Nov  7 14:47 /usr/bin/awk -> gawk 
[root@creditease awk]# awk --version
GNU Awk 4.0.2

二、awk的格式

awk指令是由模式、動(dòng)作,或者模式和動(dòng)作的組合組成。

Linux中awk語(yǔ)法怎么使用

Linux中awk語(yǔ)法怎么使用

  • 模式即pattern,可以類似理解成sed的模式匹配,可以由表達(dá)式組成,也可以是兩個(gè)正斜杠之間的正則表達(dá)式。比如NR==1,這就是模式,可以把它理解為一個(gè)條件。

  • 動(dòng)作即action,是由在大括號(hào)里面的一條或多條語(yǔ)句組成,語(yǔ)句之間使用分號(hào)隔開。如下awk使用格式。

三、記錄和域

名稱含義
record記錄,行
filed域,區(qū)域,字段,列

1)NF(number of field)表示一行中的區(qū)域(列)數(shù)量,$NF取最后一個(gè)區(qū)域。

2)$符號(hào)表示取某個(gè)列(區(qū)域),$1,$2,$NF

3)NR (number of record) 行號(hào),awk對(duì)每一行的記錄號(hào)都有一個(gè)內(nèi)置變量NR來(lái)保存,每處理完一條記錄NR的值就會(huì)自動(dòng)+1

4)FS(-F)field separator 列分隔符,以什么把行分隔成多列

3.1 指定分隔符

[root@creditease awk]# awk -F "#" '{print $NF}' awk.txt 
GKL$123
GKL$213
GKL$321
[root@creditease awk]# awk -F '[#$]' '{print $NF}' awk.txt 
123
213
321

3.2 條件動(dòng)作基本的條件和動(dòng)作

[root@creditease awk]# cat awk.txt 
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" 'NR==1{print $1}' awk.txt
ABC

3.3 只有條件

 [root@creditease awk]# awk -F "#" 'NR==1' awk.txt
ABC#DEF#GHI#GKL$123

默認(rèn)會(huì)有動(dòng)作{print $0}

3.4 只有動(dòng)作

[root@creditease awk]# awk -F "#" '{print $1}' awk.txt
ABC
BAC
CAB

默認(rèn)處理所有行

3.5 多個(gè)模式和動(dòng)作

[root@creditease awk]# awk -F "#" 'NR==1{print $NF}NR==3{print $NF}' awk.txt 
GKL$123
GKL$321

3.6 對(duì)$0的認(rèn)識(shí)

awk中$0表示整行

[root@creditease awk]# awk '{print $0}' awk_space.txt
ABC DEF GHI GKL$123
BAC DEF GHI GKL$213
CBA DEF GHI GKL$321

3.7 FNR

FNR與NR類似,不過(guò)多文件記錄不遞增,每個(gè)文件都從1開始(后邊處理多文件會(huì)講到)

[root@creditease awk]# awk '{print NR}' awk.txt awk_space.txt 
1
2
3
4
5
6
[root@creditease awk]# awk '{print FNR}' awk.txt awk_space.txt 
1
2
3
1
2
3

四、正則表達(dá)式與操作符

awk同sed一樣也可以通過(guò)模式匹配來(lái)對(duì)輸入的文本進(jìn)行匹配處理。 awk也支持大量的正則表達(dá)式模式,大部分與sed支持的元字符類似,而且正則表達(dá)式是玩轉(zhuǎn)三劍客的必備工具。

awk支持的正則表達(dá)式元字符

Linux中awk語(yǔ)法怎么使用

awk默認(rèn)不支持的元字符,和需要添加參數(shù)才能支持的元字符

元字符功能示例解釋
x{m}x重復(fù)m次/cool{5}/需要注意一點(diǎn)的是,cool加括號(hào)或不加括號(hào)的區(qū)別,x可以使字符串也可以只是一個(gè)字符,所以/cool{5}/表示匹配coo再加上5個(gè)l,即coolllll。/(cool){2,}/表示匹配coolcool,coolcoolcool等。
x{m,}x重復(fù)至少m次/(cool){2,}/同上
x{m,n}x重復(fù)至少m次,但不超過(guò)n次,需要指定參數(shù):--posix或者--re-interval。沒有該參數(shù)不能使用這種模式/(cool){5,6}/同上

正則表達(dá)式的運(yùn)用,默認(rèn)是在行內(nèi)查找匹配的字符串,若有匹配則執(zhí)行action操作,但是有時(shí)候僅需要固定的列表匹配指定的正則表達(dá)式。

比如:

我想取/etc/passwd文件中第五列($5)這一列查找匹配mail字符串的行,這樣就需要用另外兩個(gè)匹配操作符。并且awk里面只有這兩個(gè)操作符來(lái)匹配正則表達(dá)式的。


正則匹配操作符
~用于對(duì)記錄或區(qū)域的表達(dá)式進(jìn)行匹配。
!~用于表達(dá)與~相反的意思。

4.1 正則實(shí)例

1)顯示awk.txt中GHI列

[root@creditease awk]# cat awk.txt 
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '{print $3}' awk.txt 
GHI
GHI
GHI
[root@creditease awk]# awk -F "#" '{print $(NF-1)}' awk.txt 
GHI
GHI
GHI

2)顯示包含321的行

[root@creditease awk]# awk '/321/{print $0}' awk.txt 
CBA#DEF#GHI#GKL$321

3)以#為分隔符,顯示第一列以B開頭或最后一列以1結(jié)尾的行

[root@creditease awk]# awk -F "#" '$1~/^B/{print $0}$NF~/1$/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

4)以#為分隔符,顯示第一列以B或C開頭的行

[root@creditease awk]# awk -F "#" '$1~/^B|^C/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1~/^[BC]/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1~/^(B|C)/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1!~/^A/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

五、比較表達(dá)式

awk是一種編程語(yǔ)言,能夠進(jìn)行更為復(fù)雜的判斷,當(dāng)條件為真時(shí),awk就執(zhí)行相關(guān)的action,主要是在針對(duì)某一區(qū)域做出相關(guān)的判斷,比如打印成績(jī)?cè)?0分以上的,這樣就必須對(duì)這一個(gè)區(qū)域作比較判斷.

下表列出了awk可以使用的關(guān)系運(yùn)算符,可以用來(lái)比較數(shù)字字符串,還有正則表達(dá)式,當(dāng)表達(dá)式為真的時(shí)候,表達(dá)式結(jié)果為1,否則為0,只有表達(dá)式為真,awk才執(zhí)行相關(guān)的action。

awk支持的關(guān)系運(yùn)算符

運(yùn)算符含義示例
<小于x>y
<=小于或等于。x<=y
==等于x==y
!=不等于x!=y
>=大于或等于x>=y
>大于x<y

5.1 比較表達(dá)式實(shí)例

顯示awk.txt的第2 ,3 行

NR //,//

[root@creditease awk]# awk 'NR==2{print $0}NR==3{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk 'NR>=1{print $0}' awk.txt 
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk '/BAC/,/CBA/{print $0}' awk.txt 
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

第二篇 awk模塊、變量與執(zhí)行

完整awk結(jié)構(gòu)圖如下:

Linux中awk語(yǔ)法怎么使用

一、BEGIN模塊

BEGIN模塊在awk讀取文件之前就執(zhí)行,BEGIN模式常常被用來(lái)修改內(nèi)置變量ORS,RS,F(xiàn)S,OFS等的值??梢圆唤尤魏屋斎胛募?/p>

二、awk內(nèi)置變量(預(yù)定義變量)

變量名屬性
$0當(dāng)前記錄,一整行
$1,$2,$3....$a當(dāng)前記錄的第n個(gè)區(qū)域,區(qū)域間由FS分隔。
FS輸入?yún)^(qū)域分隔符,默認(rèn)是空格。field separator
NF當(dāng)前記錄中的區(qū)域個(gè)數(shù),就是有多少列。number of field
NR已經(jīng)讀出的記錄數(shù),就是行號(hào),從1開始。number of record
RS輸入的記錄分隔符默認(rèn)為換行符。record separator
OFS輸出區(qū)域分隔符,默認(rèn)也是空格。output record separator
FNR當(dāng)前文件的讀入記錄號(hào),每個(gè)文件重新計(jì)算。
FILENAME當(dāng)前正在處理的文件的文件名

特別提示:FS RS支持正則表達(dá)式

2.1 第一個(gè)作用: 定義內(nèi)置變量

[root@creditease awk]# awk 'BEGIN{RS="#"}{print $0}' awk.txt 
ABC
DEF
GHI
GKL$123
BAC
DEF
GHI
GKL$213
CBA
DEF
GHI
GKL$321

2.2 第二個(gè)作用:打印標(biāo)識(shí)

[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}' awk.txt 
=======start======
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

2.3 awk實(shí)現(xiàn)計(jì)算功能

 [root@creditease files]# awk 'BEGIN{a=8;b=90;print a+b,a-c,a/b,a%b}'
98 8 0.0888889 8

三、END模塊

END在awk讀取完所有的文件的時(shí)候,再執(zhí)行END模塊,一般用來(lái)輸出一個(gè)結(jié)果(累加,數(shù)組結(jié)果)。也可以是和BEGIN模塊類似的結(jié)尾標(biāo)識(shí)信息。

3.1 第一個(gè)作用:打印標(biāo)識(shí)

[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}END{print "=======end======"}' awk.txt
=======start======
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
=======end======

3.2 第二個(gè)作用:累加

1)統(tǒng)計(jì)空行(/etc/services文件)

grep sed awk

[root@creditease awk]# grep "^$" /etc/services  |wc -l
17
[root@creditease awk]# sed -n '/^$/p' /etc/services |wc -l
17
[root@creditease awk]# awk '/^$/' /etc/services |wc -l
17
[root@creditease awk]# awk '/^$/{i=i+1}END{print i}' /etc/services
17

2)算術(shù)題

1+2+3......+100=5050,怎么用awk表示?

[root@creditease awk]# seq 100|awk '{i=i+$0}END{print i}'
5050

四、awk詳解小結(jié)

1、BEGIN和END模塊只能有一個(gè),BEGIN{}BEGIN{}或者END{}END{}都是錯(cuò)誤的。

2、找誰(shuí)干啥模塊,可以是多個(gè)。

五、awk執(zhí)行過(guò)程總結(jié)

Linux中awk語(yǔ)法怎么使用

awk執(zhí)行過(guò)程:

1、命令行的賦值(-F或-V)

2、執(zhí)行BEGIN模式里面的內(nèi)容

3、開始讀取文件

4、判斷條件(模式)是否成立

  • 成立則執(zhí)行對(duì)應(yīng)動(dòng)作里面的內(nèi)容

  • 讀取下一行,循環(huán)判斷

  • 直到讀取到最后一個(gè)文件的結(jié)尾

5、最后執(zhí)行END模式里面的內(nèi)容

第三篇:awk數(shù)組與語(yǔ)法

一、awk數(shù)組

1.1 數(shù)組結(jié)構(gòu)

Linux中awk語(yǔ)法怎么使用

people[police]=110

people[doctor]=120

[root@creditease awk]# awk 'BEGIN{word[0]="credit";word[1]="easy";print word[0],word[1]}'
credit easy
[root@creditease awk]# awk 'BEGIN{word[0]="credit";word[1]="easy";for(i in word)print word[i]}'
credit
easy

1.2 數(shù)組分類

索 引數(shù)組:以數(shù)字為下標(biāo)
關(guān)聯(lián)數(shù)組:以字符串為下標(biāo) 

1.3 awk關(guān)聯(lián)數(shù)組

現(xiàn)有如下文本,格式如下:即左邊是隨機(jī)字母,右邊是隨機(jī)數(shù)字, 即將相同的字母后面的數(shù)字加在一起,按字母的順序輸出

a  1
b  3
c  2
d  7
b  5
a  3 
g  2
f  6

以$1為下標(biāo),創(chuàng)建數(shù)組a[$1]=a[$1]+$2(a[$1]+=$2)然后配合END和for循環(huán)輸出結(jié)果:

[root@creditease awk]# awk '{a[$1]=a[$1]+$2}END{for(i in a)print i,a[i]}' jia.txt 
a 4
b 8
c 2
d 7
f 6
g 2
注意:for(i in a) 循環(huán)的順序不是按照文本內(nèi)容的順序來(lái)處理的,排序可以在命令后加sort排序

1.4 awk索引數(shù)組

以數(shù)字為下標(biāo)的數(shù)組 seq生成1-10的數(shù)字,要求只顯示計(jì)數(shù)行

[root@creditease awk]# seq 10|awk '{a[NR]=$0}END{for(i=1;i<=NR;i+=2){print a[i]}}'
1
3
5
7
9

seq生成1-10的數(shù)字,要求不顯示文件的后3行

[root@creditease awk]# seq 10|awk '{a[NR]=$0}END{for(i=1;i<=NR-3;i++){print a[i]}}'
1
2
3
4
5
6
7
解析:改變i的范圍即可,多用于不顯示文件的后幾行

1.5 awk數(shù)組實(shí)戰(zhàn)去重

a++ 和 ++a 

[root@creditease awk]# awk 'BEGIN{print a++}'
[root@creditease awk]# awk 'BEGIN{print ++a}'
1
[root@creditease awk]# awk 'BEGIN{a=1;b=a++;print a,b}'
2 1
[root@creditease awk]# awk 'BEGIN{a=1;b=++a;print a,b}'
2 2
注:
都是 b = a+1
b=a++ 先把 a 的值賦予b,然后 a + 1
b=++a 先執(zhí)行a+1,然后把a(bǔ)的值賦予b

對(duì)一下文本進(jìn)行去重處理 針對(duì)第二列去重

[root@creditease awk]# cat qc.txt 
2018/10/20   xiaoli     13373305025
2018/10/25   xiaowang   17712215986
2018/11/01   xiaoliu    18615517895 
2018/11/12   xiaoli     13373305025
2018/11/19   xiaozhao   15512013263
2018/11/26   xiaoliu    18615517895
2018/12/01   xiaoma     16965564525
2018/12/09   xiaowang   17712215986
2018/11/24   xiaozhao   15512013263
解法一:
[root@creditease awk]# awk '!a[$2]++' qc.txt 
2018/10/20   xiaoli     13373305025
2018/10/25   xiaowang   17712215986
2018/11/01   xiaoliu    18615517895 
2018/11/19   xiaozhao   15512013263
2018/12/01   xiaoma     16965564525
解析:
!a[$3]++是模式(條件),命令也可寫成awk '!
a[$3]=a[$3]+1{print $0}' qc.txt
a[$3]++ ,“++”在后,先取值后加一
!a[$3]=a[$3]+1:是先取a[$3]的值,比較“!a[$3]”是否符合條件(條件非0),后加1
注意:此方法去重后的結(jié)果顯示的是文本開頭開始的所有不重復(fù)的行
解法二:
[root@creditease awk]# awk '++a[$2]==1' qc.txt 
2018/10/20   xiaoli     13373305025
2018/10/25   xiaowang   17712215986
2018/11/01   xiaoliu    18615517895 
2018/11/19   xiaozhao   15512013263
2018/12/01   xiaoma     16965564525
解析:
++a[$3]==1是模式(條件),也可寫成a[$3]=a[$3]+1==1即只有當(dāng)條件(a[$3]+1的結(jié)果)為1的時(shí)候才打印出內(nèi)容
++a[$3] ,“++”在前,先加一后取值
++a[$3]==1:是先加1,后取a[$3]的值,比較“++a[$3]”是否符合條件(值為1)
注意:此方法去重后的結(jié)果顯示的是文本開頭開始的所有不重復(fù)的行
解法三:
[root@creditease awk]# awk '{a[$2]=$0}END{for(i in a){print a[i]}}' qc.txt
2018/11/12   xiaoli     13373305025
2018/11/26   xiaoliu    18615517895
2018/12/01   xiaoma     16965564525
2018/12/09   xiaowang   17712215986
2018/11/24   xiaozhao   15512013263
解析:
注意此方法去重后的結(jié)果顯示的是文本結(jié)尾開始的所有不重復(fù)的行

1.6 awk處理多個(gè)文件(數(shù)組、NR、FNR)

使用awk取file.txt的第一列和file1.txt的第二列然后重定向到一個(gè)新文件new.txt中

[root@creditease awk]# cat file1.txt 
a b
c d
e f
g h
i j
[root@creditease awk]# cat file2.txt 
1 2
3 4
5 6
7 8
9 10
[root@creditease awk]# awk 'NR==FNR{a[FNR]=$1}NR!=FNR{print a[FNR],$2}' file1.txt file2.txt 
a 2
c 4
e 6
g 8
i 10
解析:NR==FNR處理的是第一個(gè)文件,NR!=FNR處理的是第二個(gè)文件.
注意:當(dāng)兩個(gè)文件NR(行數(shù))不同的時(shí)候,需要把行數(shù)多的放前邊.
解決方法:把行數(shù)多的文件放前邊,行數(shù)少的文件放后邊.
把輸出的結(jié)果放入一個(gè)新文件new.txt中:
[root@creditease awk]# awk 'NR==FNR{a[FNR]=$1}NR!=FNR{print a[FNR],$2>"new.txt"}' file1.txt file2.txt 
[root@creditease awk]# cat new.txt 
a 2
c 4
e 6
g 8
i 10

1.7 awk分析日志文件,統(tǒng)計(jì)訪問網(wǎng)站的個(gè)數(shù)

[root@creditease awk]# cat url.txt 
http://www.baidu.com
http://mp4.video.cn
http://www.qq.com
http://www.listeneasy.com
http://mp3.music.com
http://www.qq.com
http://www.qq.com
http://www.listeneasy.com
http://www.listeneasy.com
http://mp4.video.cn
http://mp3.music.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
[root@creditease awk]# awk -F "[/]+" '{h[$2]++}END{for(i in h) print i,h[i]}' url.txt
www.qq.com 3
www.baidu.com 5
mp4.video.cn 2
mp3.music.com 2
www.crediteasy.com 3

二、awk簡(jiǎn)單語(yǔ)法

2.1 函數(shù)sub gsub

替換功能

格式:sub(r, s ,目標(biāo)) gsub(r, s ,目標(biāo))

[root@creditease awk]# cat sub.txt 
ABC DEF AHI GKL$123
BAC DEF AHI GKL$213
CBA DEF GHI GKL$321
[root@creditease awk]# awk '{sub(/A/,"a");print $0}' sub.txt 
aBC DEF AHI GKL$123
BaC DEF AHI GKL$213
CBa DEF GHI GKL$321
[root@creditease awk]# awk '{gsub(/A/,"a");print $0}' sub.txt 
aBC DEF aHI GKL$123
BaC DEF aHI GKL$213
CBa DEF GHI GKL$321
注:sub只會(huì)替換行內(nèi)匹配的第一次內(nèi)容;相當(dāng)于sed ‘s###’
    gsub 會(huì)替換行內(nèi)匹配的所有內(nèi)容;相當(dāng)于sed ‘s###g’
[root@creditease awk]# awk '{sub(/A/,"a",$1);print $0}' sub.txt 
aBC DEF AHI GKL$123
BaC DEF AHI GKL$213
CBa DEF GHI GKL$321

練習(xí):

0001|20081223efskjfdj|EREADFASDLKJCV
0002|20081208djfksdaa|JDKFJALSDJFsddf
0003|20081208efskjfdj|EREADFASDLKJCV
0004|20081211djfksdaa1234|JDKFJALSDJFsddf
以'|'為分隔, 現(xiàn)要將第二個(gè)域字母前的數(shù)字去掉,其他地方都不變, 輸出為:
0001|efskjfdj|EREADFASDLKJCV
0002|djfksdaa|JDKFJALSDJFsddf
0003|efskjfdj|EREADFASDLKJCV
0004|djfksdaa1234|JDKFJALSDJFsddf
方法:
awk -F '|'  'BEGIN{OFS="|"}{sub(/[0-9]+/,"",$2);print $0}' sub_hm.txt
awk -F '|'  -v OFS="|" '{sub(/[0-9]+/,"",$2);print $0}' sub_hm.txt

2.2 if和slse的用法

內(nèi)容:

AA

BC

AA

CB

CC

AA

結(jié)果:

AA YES

BC NO YES

AA YES

CB NO YES

CC NO YES

AA YES

1) [root@creditease awk]# awk '{if($0~/AA/){print $0" YES"}else{print $0" NO YES"}}' ifelse.txt 
AA YES
BC NO YES
AA YES
CB NO YES
CC NO YES
AA YES
解析:使用if和else,if $0匹配到AA,則打印$0 "YES",else反之打印$0 " NO YES"。
2)[root@creditease awk]# awk '$0~/AA/{print $0" YES"}$0!~/AA/{print $0" NO YES"}' ifelse.txt 
AA YES
BC NO YES
AA YES
CB NO YES
CC NO YES
AA YES
解析:使用正則匹配,當(dāng)$0匹配AA時(shí),打印出YES,反之,打印出“NO YES”

2.3 next用法

如上題,用next來(lái)實(shí)現(xiàn)

next :跳過(guò)它后邊的所有代碼

 [root@creditease awk]# awk '$0~/AA/{print $0" YES";next}{print $0" NO YES"}' ifelse.txt 
AA YES
BC NO YES
AA YES
CB NO YES
CC NO YES
AA YES
解析:
{print $0" NO YES"}:此動(dòng)作是默認(rèn)執(zhí)行的,當(dāng)前邊的$0~/AA/匹配,就會(huì)執(zhí)行{print $0" YES";next}
因?yàn)閍ction中有next,所以會(huì)跳過(guò)后邊的action。
如果符合$0~/AA/則打印YES ,遇到next后,后邊的動(dòng)作不執(zhí)行;如果不符合$0~/AA/,會(huì)執(zhí)行next后邊的動(dòng)作;
next前邊的(模式匹配),后邊的就不執(zhí)行,前邊的不執(zhí)行(模式不匹配),后邊的就執(zhí)行。

2.4 printf不換行輸出以及next用法

printf :打印后不換行

如下文本,如果 Description:之后為空,將其后一行內(nèi)容并入此行。

Packages: Hello-1
Owner: me me me me
Other: who care?
Description:
Hello world!
Other2: don't care
想要結(jié)果:
Packages: Hello-1
Owner: me me me me
Other: who care?
Description: Hello world!
Origial-Owner: me me me me
Other2: don't care
1)[root@creditease awk]# awk '/^Desc.*:$/{printf $0}!/Desc.*:$/{print $0}' printf.txt 
Packages: Hello-1
Owner: me me me me
Other: who care?
Description:Hello world!
Other2: don't care
解析:使用正則匹配,匹配到'/^Desc.*:$/,就使用printf打?。ú粨Q行),不匹配的打印出整行。
2)使用if和else實(shí)現(xiàn)
[root@creditease awk]# awk '{if(/Des.*:$/){printf $0}else{print $0}}' printf.txt 
Packages: Hello-1
Owner: me me me me
Other: who care?
Description:Hello world!
Other2: don't care
3)使用next實(shí)現(xiàn)
[root@creditease awk]# awk '/Desc.*:$/{printf $0;next}{print $0}' printf.txt 
Packages: Hello-1
Owner: me me me me
Other: who care?
Description:Hello world!
Other2: don't care
注:可簡(jiǎn)寫成awk '/Desc.*:$/{printf $0;next}1'
printf.txt  ## 1是pattern(模式),默認(rèn)action(動(dòng)作)是{print $0}

2.5 去重后計(jì)數(shù)按要求重定向到指定文件

文本如下,要求計(jì)算出每項(xiàng)重復(fù)的個(gè)數(shù),然后把重復(fù)次數(shù)大于2的放入gt2.txt文件中,把重復(fù)次數(shù)小于等于2的放入le2.txt文件中

[root@creditease files]# cat qcjs.txt 
aaa
bbb
ccc
aaa
ddd
bbb
rrr
ttt
ccc
eee
ddd
rrr
bbb
rrr
bbb
[root@creditease awk]# awk '{a[$1]++}END{for(i in a){if(a[i]>2){print i,a[i]>"gt2.txt"}else{print i,a[i]>"le2.txt"}}}' qcjs.txt 
[root@creditease awk]# cat gt2.txt 
rrr 3
bbb 4
[root@creditease awk]# cat le2.txt 
aaa 2
ccc 2
eee 1
ttt 1
ddd 2
解析:{print },或括號(hào)中打印后可直接重定向到一個(gè)新文件,文件名用雙引號(hào)引起來(lái)。如: {print $1 >"xin.txt"}

三、awk需注意事項(xiàng)

a)NR==FNR ##不能寫成NR=FNR(=在awk中是賦值的意思)

b)NR!=FNR ##NR不等于FNR

c){a=1;a[NR]} 這樣會(huì)報(bào)錯(cuò):同一條命令中變量和數(shù)組名不能重復(fù) d)printf 輸出的時(shí)候不換行

e){print },或括號(hào)中打印后可直接重定向到一個(gè)新文件,文件名用雙引號(hào)引起來(lái)。如: {print $1 >"xin.txt"}

f)當(dāng)模式(條件)是0的時(shí)候,后邊的動(dòng)作不執(zhí)行,!0的時(shí)候后邊動(dòng)作才執(zhí)行。

“Linux中awk語(yǔ)法怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI