文本处理三剑客——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 ~]
[root@stw ~]
nimgtw 48003/ udp
3gpp- cbsp 48049/ tcp
isnetserv 48128/ tcp
isnetserv 48128/ udp
blp5 48129/ tcp
blp5 48129/ udp
com- bardac- dw 48556/ tcp
com- bardac- dw 48556/ udp
iqobject 48619/ tcp
iqobject 48619/ udp
(1)打印匹配blp5开头的行
[root@stw ~]
/ /- n:不打印模式空间,p:打印当前的模式空间 / ^blp5/ :以blp5开头
blp5 48129/ tcp
blp5 48129/ udp
(2)打印第一行
[root@stw ~]
nimgtw 48003/ udp
(3)打印第一行至第三行
[root@stw ~]
nimgtw 48003/ udp
3gpp- cbsp 48049/ tcp
isnetserv 48128/ tcp
[root@stw ~]
nimgtw 48003/ udp
3gpp- cbsp 48049/ tcp
isnetserv 48128/ tcp
(4)打印奇数行
[root@stw ~]
nimgtw 48003/ udp
isnetserv 48128/ tcp
blp5 48129/ tcp
com- bardac- dw 48556/ tcp
iqobject 48619/ tcp
[root@stw ~]
1
3
5
7
9
(5)打印偶数行
[root@stw ~]
3gpp- cbsp 48049/ tcp
isnetserv 48128/ udp
blp5 48129/ udp
com- bardac- dw 48556/ udp
iqobject 48619/ udp
[root@stw ~]
2
4
6
8
10
(6)打印匹配行及后一行
[root@stw ~]
blp5 48129/ tcp
blp5 48129/ udp
(7)打印最后一行
[root@stw ~]
iqobject 48619/ udp
(8)不打印最后一行
[root@stw ~]
nimgtw 48003/ udp
3gpp- cbsp 48049/ tcp
isnetserv 48128/ tcp
isnetserv 48128/ udp
blp5 48129/ tcp
blp5 48129/ udp
com- bardac- dw 48556/ tcp
com- bardac- dw 48556/ udp
iqobject 48619/ tcp
[root@stw ~]
sed: - e expression
/ /! 要写在$的后面,p的前面
(9)匹配范围(打印以/blp5/开头,/ com/结束的行)
[root@stw ~]
blp5 48129/ tcp
blp5 48129/ udp
com- bardac- dw 48556/ tcp
匹配blp5所在行到最后一行
[root@stw ~]
blp5 48129/ tcp
blp5 48129/ udp
com- bardac- dw 48556/ tcp
com- bardac- dw 48556/ udp
iqobject 48619/ tcp
iqobject 48619/ udp
(10)引用系统变量,用引号
[root@stw ~]
sed: - e expression
[root@stw ~]
[root@stw ~]
3gpp- cbsp 48049/ tcp
isnetserv 48128/ tcp
[root@stw ~]
[root@stw ~]
3gpp- cbsp 48049/ tcp
isnetserv 48128/ tcp
案例二:删除匹配
(1)删除带有/blp5/的行
[root@stw ~]
nimgtw 48003/ udp
3gpp- cbsp 48049/ tcp
isnetserv 48128/ tcp
isnetserv 48128/ udp
com- bardac- dw 48556/ tcp
com- bardac- dw 48556/ udp
iqobject 48619/ tcp
iqobject 48619/ udp
(2)删除第一行
[root@stw ~]
3gpp- cbsp 48049/ tcp
isnetserv 48128/ tcp
isnetserv 48128/ udp
blp5 48129/ tcp
blp5 48129/ udp
com- bardac- dw 48556/ tcp
com- bardac- dw 48556/ udp
iqobject 48619/ tcp
iqobject 48619/ udp
(3)删除奇数行
[root@stw ~]
3gpp- cbsp 48049/ tcp
isnetserv 48128/ udp
blp5 48129/ udp
com- bardac- dw 48556/ udp
iqobject 48619/ udp
[root@stw ~]
2
4
6
8
10
(4)删除一到三行
[root@stw ~]
isnetserv 48128/ udp
blp5 48129/ tcp
blp5 48129/ udp
com- bardac- dw 48556/ tcp
com- bardac- dw 48556/ udp
iqobject 48619/ tcp
iqobject 48619/ udp
打印时把匹配的打印出来,删除时把匹配的删除,删除只是不用-n选项
练习:去除空格/etc/httpd/conf/httpd.conf文件的空行或开头#号的行
(前提有这个文件)
[root@stw ~]
ServerRoot "/etc/httpd"
Listen 80
Include conf. modules. d/* . conf
User apache