当前位置: 首页 > news >正文

45.sed,awk详解及相关案例

sed,awk详解及相关案例

sed(流编辑器)是一种非交互式的流编辑器,用于对输入流(文件或管道)进行基本的文本转换

选项:

  • -n - 不打印模式空间
  • -e - 执行脚本、表达式来处理
  • -f - 从文件读取执行动作
  • -i - 修改原文件
  • -r - 使用扩展正则表达式

常用命令:

  • s/regexp/replace/ - 替换字符串
  • p - 打印当前模式空间
  • P - 打印模式空间的第一行
  • d - 删除模式空间,开始下一个循环
  • D - 删除模式空间的第一行,开始下一个循环
  • = - 打印当前行号
  • a \text - 当前行追加文本
  • i \text - 当前行上面插入文本
  • c \text - 所选行替换新文本
  • q - 立即退出sed脚本
  • r - 从文件追加文本
  • h/H - 复制/追加模式空间到保持空间
  • g/G - 复制/追加保持空间到模式空间
  • x - 交换模式空间和保持空间内容
  • l - 打印模式空间的行,并显示控制字符$
  • n/N - 读取/追加下一行输入到模式空间
  • w filename - 写入当前模式空间到文件
  • ! - 取反、否定
  • & - 引用已匹配字符串

地址匹配:

  • first~step - 从first开始,每step步输出值
  • $ - 匹配最后一行
  • /regexp/ - 正则表达式匹配行
  • number - 只匹配指定行
  • addr1,addr2 - 从addr1行开始,到addr2行结束
  • addr1,+N - 从addr1行开始,向后的N行
  • addr1,~N - 从addr1行开始,到N行结束
[root@xieyuhui2 ~]# vim /tmp/servicesnimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

打印匹配blp5开头的行

[root@xieyuhui2 ~]# cat /tmp/services | sed -n '/^blp5/p'
blp5 			48129/tcp 	     # Bloomberg locator
blp5 			48129/udp 	     # Bloomberg locator

打印第一行

[root@xieyuhui2 ~]# cat /tmp/services |sed -n '1p'
nimgtw 		48003/udp 		# Nimbus Gateway

打印第一行至第三行

[root@xieyuhui2 ~]# cat /tmp/services |sed -n '1,3p'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 	     # 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 	     # Image Systems Network Services

打印奇数行

[root@xieyuhui2 ~]# seq 10 | sed -n '1~2p'
1	
3
5	
7
9

打印匹配行及后一行

[root@xieyuhui2 ~]# cat /tmp/services |sed -n '/blp5/,+1p'
blp5 			48129/tcp 	     # Bloomberg locator
blp5 			48129/udp 	     # Bloomberg locator

打印最后一行

[root@xieyuhui2 ~]# cat /tmp/services |sed -n '$p'
iqobject 		48619/udp 	     # iqobject

不打印最后一行

[root@xieyuhui2 ~]# cat /tmp/services |sed -n '$!p'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 	     # 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 	     # Image Systems Network Services
isnetserv 		48128/udp 	     # Image Systems Network Services
blp5 			48129/tcp 	     # Bloomberg locator
blp5 			48129/udp 	     # Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 	     # iqobject

匹配范围

打印以blp5开头,到以com开头的

[root@xieyuhui2 ~]# cat /tmp/services | sed -n '/^blp5/,/^com/p'
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw

匹配blp5所在行到最后一行

[root@xieyuhui2 ~]# cat /tmp/services | sed -n '/^blp5/,$p'
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

引用系统变量,用引号

[root@xieyuhui2 ~]# a=1
[root@xieyuhui2 ~]# cat /tmp/services | sed -n "$a,3p"
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services

删除匹配

删除有blp5的那行

cat /tmp/services | sed '/blp5/d'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

删除第一行

[root@xieyuhui2 ~]# cat /tmp/services | sed '1d'
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

删除奇数行

[root@xieyuhui2 ~]# seq 6 | sed '1~2d'
2
4
6

删除偶数行

[root@xieyuhui2 ~]# seq 6 | sed '2~2d'
1
3
5

替换(s///)

替换blp5字符串为test

[root@xieyuhui2 ~]# cat /tmp/services | sed 's/blp5/test/'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
test 			48129/tcp 		# Bloomberg locator
test 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

全局替换加g


替换开头是blp5的字符串并打印

cat /tmp/services | sed -n 's/^blp5/test/p'
test 			48129/tcp 		# Bloomberg locator
test 			48129/udp 		# Bloomberg locator

使用&命令引用匹配内容并替换

48049换成48049.123

[root@xieyuhui2 ~]# cat /tmp/services | sed  's/48049/&.123/'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049.123/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

ip加双引号

[root@xieyuhui2 ~]# echo '10.10.10.1 10.10.10.2 10.10.10.3' | sed -r 's/[^ ]+/"&"/g'
"10.10.10.1" "10.10.10.2" "10.10.10.3"

对1-5行的blp5进行替换

[root@xieyuhui2 ~]# cat /tmp/services | sed  '1,5s/blp5/test/'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
test 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

对匹配行进行替换,先匹配出来48129/tcp所在行,然后再将改行的blp5字符串替换为test

[root@xieyuhui2 ~]# cat /tmp/services | sed '/48129\/tcp/s/blp5/test/'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
test 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

二次匹配替换

先把blp5替换成test,再把3g替换成4g

[root@xieyuhui2 ~]# cat /tmp/services | sed 's/blp5/test/;s/3g/4g/'
nimgtw 		48003/udp 		# Nimbus Gateway
4gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
test 			48129/tcp 		# Bloomberg locator
test 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

分组使用

在480.*后面加上test

[root@xieyuhui2 ~]# cat /tmp/services | sed -r 's/(.*)(480.*)(#.*)/\1\2test \3/'
nimgtw 		48003/udp 		test # Nimbus Gateway
3gpp-cbsp 		48049/tcp 		test # 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

将协议与端口号位置互换

[root@xieyuhui2 ~]# cat /tmp/services | sed -r 's/(.*)(\<[0-9]+\>)\/(tcp|udp)(.*)/\1\3\/\2\4/'
nimgtw 		udp/48003 		# Nimbus Gateway
3gpp-cbsp 		tcp/48049 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		tcp/48128 		# Image Systems Network Services
isnetserv 		udp/48128 		# Image Systems Network Services
blp5 			tcp/48129 		# Bloomberg locator
blp5 			udp/48129 		# Bloomberg locator
com-bardac-dw 	tcp/48556 		# com-bardac-dw
com-bardac-dw 	udp/48556 		# com-bardac-dw
iqobject 		tcp/48619 		# iqobject
iqobject 		udp/48619 		# iqobject

位置调换

[root@xieyuhui2 ~]# echo "abc cde xyz" | sed -r  's/(.*)x/\1X/'
abc cde Xyz
[root@xieyuhui2 ~]# echo "abc cde xxyxz" | sed -r  's/(.*)x/\1X/'
abc cde xxyXz
[root@xieyuhui2 ~]# echo "abc cde xxyxz" | sed -r  's/(.*)y/\1Y/'
abc cde xxYxz

将cde和456互换位置

[root@xieyuhui2 ~]# echo "abc:cde;123:456" | sed -r 's/([^:]*)(;.*:)([^:]+$)/\3\2\1/'
abc:456;123:cde

注释匹配行后的多少行

[root@xieyuhui2 ~]# seq 10 |sed '/5/,+3s/^/#/'
1
2
3
4
#5
#6
#7
#8
9
10

注释指定多行

[root@xieyuhui2 ~]# seq 5 |sed -r '/^3|^4/s/^/#/'
1
2
#3
#4
5
[root@xieyuhui2 ~]# seq 5 |sed -r 's/^3|^4/#&/'
1
2
#3
#4
5
多重编辑

删除1-4行,并将剩余行的blp5替换为test

[root@xieyuhui2 ~]# cat /tmp/services | sed -e '1,4d' -e 's/blp5/test/'
test 			48129/tcp 		# Bloomberg locator
test 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

或者

[root@xieyuhui2 ~]# cat /tmp/services |sed '1,4d;s/blp5/test/'
test 			48129/tcp 		# Bloomberg locator
test 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject
添加新内容(a、i、c)

在blp5上一行添加test

[root@xieyuhui2 ~]# cat /tmp/services |sed '/blp5/i \test'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
test
blp5 			48129/tcp 		# Bloomberg locator
test
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

在blp5下一行添加test

[root@xieyuhui2 ~]# cat /tmp/services |sed '/blp5/a \test'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
test
blp5 			48129/udp 		# Bloomberg locator
test
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

将blp5所在行替换为新行test

[root@xieyuhui2 ~]# cat /tmp/services |sed '/blp5/c \test'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
test
test
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

在指定行的下一行添加一行

[root@xieyuhui2 ~]# cat /tmp/services |sed '2a \test'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
test
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

在指定行前面和后面添加一行

[root@xieyuhui2 ~]# seq 5 |sed '3s/.*/txt\n&/'
1
2
txt
3
4
5
[root@xieyuhui2 ~]# seq 5 |sed '3s/.*/&\ntest/'
1
2
3
test
4
5
读取文件并追加到匹配行后(r)
[root@xieyuhui2 ~]# vim a.txt
123
456
[root@xieyuhui2 ~]# cat /tmp/services | sed '/blp5/r a.txt'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
123
456
blp5 			48129/udp 		# Bloomberg locator
123
456
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject
将匹配行写到文件(w)
[root@xieyuhui2 ~]# cat /tmp/services | sed '/blp5/w b.txt'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject
[root@xieyuhui2 ~]# cat b.txt 
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
读取下一行(n和N)

n 读取下一行到模式空间。
N 追加下一行内容到模式空间,并以换行符\n 分隔。

打印匹配的下一行

[root@xieyuhui2 ~]# seq 5 |sed -n '/3/{n;p}'
4

打印偶数

[root@xieyuhui2 ~]# seq 6 |sed -n 'n;p'
2
4
6
#sed 先读取第一行 1,执行 n 命令,获取下一行 2,此时模式空间是 2,执行 p 命令,打印模式空间。 现在模式空间是 2,sed 再读取 3,执行 n 命令,获取下一行 4,此时模式空间为 4,执行 p 命令

打印奇数

[root@xieyuhui2 ~]# seq 6 |sed 'n;d'
1
3
5
#读1执行n得2,然后删除2,再读3执行n得4,删除4,以此类推

每三行执行一次p命令

[root@xieyuhui2 ~]# seq 6 |sed -n 'n;n;p'
3
6

每三行替换一次

[root@xieyuhui2 ~]# seq 6 |sed 'n;n;s/^/=/;s/$/=/'
1
2
=3=
4
5
=6=

用地址匹配,来实现上面的效果

[root@xieyuhui2 ~]# seq 6 |sed '3~3{s/^/=/;s/$/=/}'
1
2
=3=
4
5
=6=

执行多个 sed 命令时,有时相互会产生影响,可以用大括号{}括起来

N命令的功能

在当前内容下追加下一行到模式空间

[root@xieyuhui2 ~]# seq 6 |sed 'N;q'
1
2

将两行合并一行

[root@xieyuhui2 ~]# seq 6 |sed 'N;s/\n//'
12
34
56

第一个命令:sed 读取第一行 1,N 命令读取下一行 2,并以\n2 追加,此时模式空间是 1\n2,再执
行 q 退出。
为了进一步说明 N 的功能,看第二个命令:执行 N 命令后,此时模式空间是 1\n2,再执行把\n 替换
为空,此时模式空间是 12,并打印

[root@xieyuhui2 ~]# seq 5 |sed -n 'N;p'
1
2
3
4
[root@xieyuhui2 ~]# seq 6 |sed -n 'N;p'
1
2
3
4
5
6
#不打印5的原因:N命令是读取下一行追加到sed读取的当前行,当N读取下一行没有内容时,则退出,也不会执行p命令打印当前行。
当行数为偶数时,N始终就能读到下一行,所以也会执行p命令
[root@xieyuhui2 ~]# seq 5 |sed -n '$!N;p'
1
2
3
4
5
#当sed执行到最后一行时,用!不执行N命令,随后执行p命令
打印和删除模式空间第一行(P(大写)和D)

P(大写) 打印模式空间的第一行。
D 删除模式空间的第一行

打印奇数

[root@xieyuhui2 ~]# seq 6 |sed -n 'N;P'
1
3
5
[root@xieyuhui2 ~]#  seq 6 |sed 'N;D'
6
#读取第一行 1,执行 N 命令读取下一行并追加到模式空间,此时模式空间是 1\n2,执行 D 命令删除
模式空间第一行 1,剩余 2。
读取1,执行N,得出1\n2,执行D,得出2,执行N,得出2\n3,执行D,得出3,依此类推,得出6,
执行N,条件失败退出,因无-n参数,故输出6
保持空间操作(h与H,g与G和x)

h 复制模式空间内容到保持空间(覆盖)。
H 复制模式空间内容追加到保持空间。
g 复制保持空间内容到模式空间(覆盖)。
G 复制保持空间内容追加到模式空间。
x 模式空间与保持空间内容互换

将匹配的内容覆盖到另一个匹配

[root@xieyuhui2 ~]# seq 6 |sed -e '/3/{h;d}' -e '/5/g'
1
2
4
3
6
#h 命令把匹配的3复制到保持空间,d命令删除模式空间的3。后面命令再对模式空间匹配5,并用g命令把保持空间3覆盖模式空间5

将匹配的内容放到最后

[root@xieyuhui2 ~]# seq 6 |sed -e '/3/{h;d}' -e '$G'
1
2
4
5
6
3

交换模式空间和保持空间

[root@xieyuhui2 ~]# seq 6 |sed -e '/3/{h;d}' -e '/5/x' -e '$G'
1
2
4
3
6
5
# 在模式空间匹配5并将保持空间的3与5交换,5就变成了3,。最后把保持空间的5追加到模式空间的

awk

awk是一种处理文本的编程语言工具,能够用简短的程序处理标准输入或文件、数据排序、计算以及生成报表等。

选项:

  • -f - 从文件中读取awk程序源文件
  • -F - 指定字段分隔符
  • -v - 变量赋值
  • --posix - 兼容POSIX正则表达式
  • --dump-variables=[file] - 把awk命令时的全局变量写入文件
  • --profile=[file] - 格式化awk语句到文件

常用模式:

  • BEGIN{ } - 给程序赋予初始状态,先执行的工作
  • END{ } - 程序结束之后执行的一些扫尾工作
  • /regular expression/ - 为每个输入记录匹配正则表达式
  • pattern && pattern - 逻辑and,满足两个模式
  • pattern || pattern - 逻辑or,满足其中一个模式
  • !pattern - 逻辑not,不满足模式
  • pattern1,pattern2 - 范围模式,匹配所有模式1的记录,直到匹配到模式2

特性:

  • awk处理方式与数据库类似,支持对记录和字段处理
  • 缺省情况下将文本文件中的一行视为一个记录
  • 将一行中的某一部分作为记录中的一个字段
  • 用1,2,3…数字的方式顺序表示行中的不同字段
  • 用$后跟数字引用对应的字段,以逗号分隔,0表示整个行
从文件读取awk程序处理文件
[root@xieyuhui2 ~]# vim test.awk
{print $2}
[root@xieyuhui2 ~]# cat /tmp/services | awk -f test.awk
48003/udp
48049/tcp
48128/tcp
48128/udp
48129/tcp
48129/udp
48556/tcp
48556/udp
48619/tcp
48619/udp
指定分隔符,打印指定字段(常用)
[root@xieyuhui2 ~]# awk -F ':' '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
libstoragemgmt
colord
rpc
saslauth

还可以指定多个分隔符,作为同一个分隔符处理

[root@xieyuhui2 ~]# tail -n3 /tmp/services |awk -F'[/#]' '{print $3}'com-bardac-dwiqobjectiqobject[root@xieyuhui2 ~]# tail -n3 /tmp/services |awk -F'[/#]' '{print $1}'
com-bardac-dw 	48556
iqobject 		48619
iqobject
[root@xieyuhui2 ~]# tail -n3 /tmp/services |awk -F'[/#]' '{print $2}'
udp 		
tcp 		
udp
[root@xieyuhui2 ~]# tail -n3 /tmp/services |awk -F'[ /]+' '{print $2}'485564861948619
# []元字符的意思是符号其中任意一个字符,也就是说每遇到一个/或#时就分隔一个字段,当用多个
分隔符时,就能更方便处理字段了     
变量赋值
[root@xieyuhui2 ~]# awk -v a=123 'BEGIN{print a}'
123
# 系统变量作为awk变量的值
[root@xieyuhui2 ~]# a=123
[root@xieyuhui2 ~]# awk -v a=$a 'BEGIN{print a}'
123
# 或使用单引号
[root@xieyuhui2 ~]# awk 'BEGIN{print '$a'}'
123
BEGIIN和END

BEGIN 模式是在处理文件之前执行该操作,常用于修改内置变量、变量赋值和打印输出的页眉或标题。

打印页眉

[root@xieyuhui2 ~]# tail /tmp/services |awk 'BEGIN{print "Service\t\tPort\t\t\tDescription\n==="}{print $0}'
Service		Port			Description
===
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

END 模式是在程序处理完才会执行

打印页尾

[root@xieyuhui2 ~]# tail /tmp/services |awk '{print $0}END{print "===\nEND......"}'
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject
===
END......
格式化输出awk命令到文件
[root@xieyuhui2 ~]#  tail /tmp/services |awk --profile 'BEGIN{print"Service\t\tPort\t\t\tDescription\n==="}{print $0}END{print "===\nEND......"}'
Service		Port			Description
===
nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject
===
END......
/re/正则匹配

匹配包含 tcp 的行

[root@xieyuhui2 ~]#  cat /tmp/services |awk '/tcp/{print $0}'
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
逻辑 and、or 和 not

匹配记录中包含 blp5 和 tcp 的行

[root@xieyuhui2 ~]# cat /tmp/services |awk '/blp5/ && /tcp/{print $0}'
blp5 			48129/tcp 		# Bloomberg locator

匹配记录中包含 blp5 或 tcp 的行

[root@xieyuhui2 ~]# cat /tmp/services |awk '/blp5/ && /tcp/{print $0}'
blp5 			48129/tcp 		# Bloomberg locator
[root@xieyuhui2 ~]# cat /tmp/services |awk '/blp5/ || /tcp/{print $0}'
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject

不匹配开头是#和空行

awk '! /^#/ && ! /^$/{print $0}' /etc/httpd/conf/httpd.conf |awk '! /^ +#/{print $0}'

匹配范围

[root@xieyuhui2 ~]# cat /tmp/services |awk '/^blp5/,/^com/'
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw

文章转载自:

http://BKoRy3C5.nbgfz.cn
http://w9QUrihP.nbgfz.cn
http://ukRH43HU.nbgfz.cn
http://lClzNG0d.nbgfz.cn
http://IqCtRQn2.nbgfz.cn
http://FR6PLIrn.nbgfz.cn
http://pjJPpNfV.nbgfz.cn
http://GFqhiY59.nbgfz.cn
http://ZvuSGDk2.nbgfz.cn
http://LHZdo8dQ.nbgfz.cn
http://Yb2hrTQC.nbgfz.cn
http://DrSosz1a.nbgfz.cn
http://AkDsgwk2.nbgfz.cn
http://UrNgs5hi.nbgfz.cn
http://IB67YGCQ.nbgfz.cn
http://tblEGJBF.nbgfz.cn
http://FxsLjwxO.nbgfz.cn
http://OeeOsMF9.nbgfz.cn
http://MQQESBM7.nbgfz.cn
http://wjzB18y3.nbgfz.cn
http://LoG15nQN.nbgfz.cn
http://4EHYIt3O.nbgfz.cn
http://Hq7GmF4J.nbgfz.cn
http://e6wxv1jc.nbgfz.cn
http://c0NI8Inz.nbgfz.cn
http://SlF3rS8Q.nbgfz.cn
http://O41hQ6wV.nbgfz.cn
http://BcQpmeGJ.nbgfz.cn
http://GeRGtTqV.nbgfz.cn
http://CMtNFM9t.nbgfz.cn
http://www.dtcms.com/a/383585.html

相关文章:

  • 聊一下贪心算法
  • 磁共振成像原理(理论)7:射频回波 (RF Echoes)-双脉冲回波
  • Python实战:实现监测抖音主播是否开播并录屏
  • MySQL中InnoDB索引使用与底层原理
  • 全网首款数学建模交互AI应用-持续更新
  • 飞牛NAS本地挂载夸克网盘、接入飞牛影视教程
  • 音视频学习(六十五):fmp4
  • 【STM32】串口的阻塞、中断、DMA收发
  • win10系统 文件夹被占用无法删除
  • LawGPT:基于中文法律知识的大模型
  • 手搓多模态-10 旋转位置编码的原理和实现
  • C# --- dispose机制与using关键字
  • HakcMyVM-Aurora
  • Flask学习笔记(一)
  • MobaXterm软件访问ZYNQ板卡的Linux系统
  • 基于vLLM与YOLO的智能图像分类系统
  • 标准CAN帧介绍
  • 蚂蚁矿机S19 Pro 104T技术参数解析及性能分析
  • 一小时解决RabbitMQ面试题
  • HBM4量产就绪|2026年AI与数据中心新标配
  • 细粒度图像分类的可解释性Finer-CAM
  • C++中多线程core的问题分析和总结
  • scrapy框架-day02
  • 电商导购平台的移动端架构设计:React Native在多端统一中的实践
  • class_9:java 抽象类和接口
  • [硬件电路-209]:电子携带两种能量,一种是电流宏观运动的动能,一种是绕着原子核运动的原子轨道能量;前者是电势能与热能转化的媒介;后者是实现光能与电能的转化
  • HBase启动报错“Master is initializing”解决方案
  • 交换机的级联和堆叠
  • QT加密和哈希
  • 历史数据分析——中科曙光