文本处理三剑客——grep、sed、awk

文本处理三剑客——grep、sed、awk

一、grep

以下是 grep 命令常用选项及功能的表格说明:
命令格式 功能描述
grep "字符串" 过滤并显示包含指定“字符串”的行
grep -v "字符串" 反向过滤,显示不包含指定“字符串”的行
grep ^"字符串" 过滤并显示以指定“字符串”开头的行
grep "字符串"$ 过滤并显示以指定“字符串”结尾的行
grep ^$ 过滤并显示空行(仅包含换行符的行)
grep -i "字符串" 过滤时不区分大小写,匹配大小写不同的相同字符
grep -o "字符串" 仅显示每行中与“字符串”匹配的部分,而非整行

二、sed

1、sed简介

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容发送往屏幕。然后读入下行,执行下一个循环。
如果没有诸如“D”的特殊命令,那会在两个循环之间清空模式空间,但不能清除保留空间。这样不断重复,直到文件末尾。(文件内容并没有改变,除非你使用重定向存储输出或-i)

2、选项
以下是 sed 命令常用选项及其说明的表格:
选项 功能描述
-n 不打印模式空间(仅显示经过处理的行,默认情况下 sed 会打印输入内容)
-e 直接在命令行中指定要执行的脚本或表达式,用于处理输入数据
-f 从指定文件中读取 sed 动作(脚本)并执行
-i 直接修改原文件内容(不创建备份),若需备份可使用 -i.bak 形式
-r 启用扩展正则表达式支持(无需对 ?+() 等元字符转义)
3、命令
以下是 sed 常用核心命令(动作)及其功能描述的表格:
sed 命令 功能描述
s/regexp/replace/ 替换字符串:用 replace 替换模式空间中匹配 regexp(正则表达式)的内容
p 打印当前模式空间中的内容(常与 -n 搭配,避免重复输出)
P(大写) 仅打印模式空间中的第一行(若模式空间包含多行,如通过 N 追加的内容)
d 删除当前模式空间中的内容,直接开始下一次循环(不打印被删除行)
D(大写) 删除模式空间中的第一行,若剩余内容非空则继续处理,否则开始下一次循环
= 打印当前模式空间对应行的行号(行号单独占一行输出)
a \text 在当前行的下方追加指定文本 text\ 用于分隔命令与文本)
i \text 在当前行的上方插入指定文本 text\ 用于分隔命令与文本)
c \text 用指定文本 text 替换当前选中的行(整行替换为 text
q 立即退出 sed 脚本,不再处理后续输入行
r filename 从指定文件 filename 中读取内容,追加到当前模式空间对应行的下方
h 将模式空间中的内容覆盖复制到保持空间(覆盖原有保持空间内容)
H 将模式空间中的内容追加到保持空间(原有保持空间内容后加换行再追加)
g 将保持空间中的内容覆盖复制到模式空间(覆盖原有模式空间内容)
G 将保持空间中的内容追加到模式空间(原有模式空间内容后加换行再追加)
x 交换模式空间与保持空间中的内容(两者内容互换)
l(小写L) 打印模式空间中的行,并显示控制字符(如换行符用 $ 标记,Tab 用 \t 等)
n 读取下一行输入到模式空间,覆盖原有模式空间内容,然后继续执行后续命令
N 读取下一行输入,追加到模式空间末尾(与原有内容用换行分隔,形成多行模式空间)
w filename 将当前模式空间中的内容写入到指定文件 filename(若文件存在会覆盖)
! 对匹配条件取反,仅对“不满足匹配条件”的行执行后续命令(如 2!d 表示不删除第2行)
& 在替换命令(s/../../)中引用“已匹配 regexp 的字符串”(如 s/abc/[&]/ 会将 abc 替换为 [abc]
4、地址
以下是 sed 中常用的地址(行选择)表示方式及其说明的表格:
地址格式 描述
first~step 从第 first 行开始,每隔 step(步长) 行匹配一次(如 1~2 匹配第1、3、5…行)
$ 匹配最后一行
/regexp/ 匹配所有能被正则表达式 regexp 匹配到的行
number 仅匹配指定行号的行(如 5 只匹配第5行)
addr1,addr2 匹配从 addr1 行开始到 addr2 行结束的所有行(闭区间)
addr1,+N addr1 行开始,向后包含 N 行(共 N+1 行,如 3,+2 匹配3、4、5行)
addr1,~N addr1 行开始,匹配到第一个能被 N 整除的行结束(如 2,~3 匹配2到3行)

5、案例

案例一:
先定义一个原始数据的文本文件
[root@stw ~]# vim /tmp/services
[root@stw ~]# cat /tmp/services
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
(1)打印匹配blp5开头的行
[root@stw ~]# cat /tmp/services | sed -n '/^blp5/p'
//-n:不打印模式空间,p:打印当前的模式空间  /^blp5/:以blp5开头
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
(2)打印第一行
[root@stw ~]# cat /tmp/services | sed -n '1p'
nimgtw 		48003/udp 		# Nimbus Gateway
(3)打印第一行至第三行
[root@stw ~]# 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@stw ~]# 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
(4)打印奇数行
[root@stw ~]# cat /tmp/services | sed -n '1~2p'   //从第一行开始,每隔两行输出
nimgtw 		48003/udp 		# Nimbus Gateway
isnetserv 		48128/tcp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
[root@stw ~]# seq 10 | sed -n '1~2p'
1
3
5
7
9
(5)打印偶数行
[root@stw ~]# cat /tmp/services | sed -n '2~2p'
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/udp 		# iqobject
[root@stw ~]# seq 10 | sed -n '2~2p'
2
4
6
8
10
(6)打印匹配行及后一行
[root@stw ~]# cat /tmp/services | sed -n '/blp5/,+1p'
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
(7)打印最后一行
[root@stw ~]# cat /tmp/services | sed -n '$p'
iqobject 		48619/udp 		# iqobject
(8)不打印最后一行
[root@stw ~]# 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
[root@stw ~]# cat /tmp/services | sed -n '!$p'
sed: -e expression #1, char 2: unknown command: `$'
//!要写在$的后面,p的前面
(9)匹配范围(打印以/blp5/开头,/com/结束的行)
[root@stw ~]# 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@stw ~]# 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
(10)引用系统变量,用引号
[root@stw ~]# cat /tmp/services | sed -n ''$a',3p'  //调用变量$a
sed: -e expression #1, char 1: unknown command: `,'
[root@stw ~]# export a=2    //手动定义变量a为2
[root@stw ~]# cat /tmp/services | sed -n ''$a',3p'  //打印第二行到第三行
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
[root@stw ~]# export a=2
[root@stw ~]# cat /tmp/services |sed -n "$a,3p"
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services

案例二:删除匹配
(1)删除带有/blp5/的行
[root@stw ~]# 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
(2)删除第一行
[root@stw ~]# 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
(3)删除奇数行
[root@stw ~]# cat /tmp/services | sed '1~2d'
3gpp-cbsp 		48049/tcp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/udp 		# iqobject
[root@stw ~]# seq 10 | sed '1~2d'
2
4
6
8
10
(4)删除一到三行
[root@stw ~]# cat /tmp/services | sed '1,3d'
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
打印时把匹配的打印出来,删除时把匹配的删除,删除只是不用-n选项
练习:去除空格/etc/httpd/conf/httpd.conf文件的空行或开头#号的行
(前提有这个文件)
[root@stw ~]# sed '/^#/d;/^$/d' /etc/httpd/conf/httpd.conf | sed -r '/[[:space:]]+#/d'
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值