文章目录
前言
awk
、sed
和grep
不仅是Linux命令行工具中的佼佼者,更是文本处理领域的三大神器。它们各自拥有独特的本领,能够高效地处理和分析文本数据:
一.文本搜索工具grep
grep
:强大的文本搜索工具,能够迅速在文件中找到符合特定模式的字符串。无论是简单的单词搜索,还是复杂的正则表达式匹配,grep
都能游刃有余地完成
语法:
grep [参数] [正则表达式] 文件
工作方式:grep在一个或者多个文件中搜索字符串模板,如果模板中包括空格,需要使用引号引起来,模板后 的所有字符串会被看作是文件名。
工作结果:如果模板搜索成功,则返回0状态码;如果搜索不成功,则返回1状态码;如果搜索的文件不存在, 则返回2的状态码。我们可以利用这些返回状态码进行一些自动化的shell脚本处理工作。
案例解析:
[root@shell shell]# grep root /etc/ssh/sshd_config
#ChrootDirectory none
[root@shell shell]# grep -i root /etc/ssh/sshd_config
PermitRootLogin yes
# the setting of "PermitRootLogin without-password".
#ChrootDirectory none
[root@shell shell]# grep -ni root /etc/ssh/sshd_config
46:PermitRootLogin yes
98:# the setting of "PermitRootLogin without-password".
128:#ChrootDirectory none
[root@shell shell]# grep -w root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
二.正则表达式
正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单的说,正 则表达式就是用在字符串的处理上面的一项表示式。由于正则表达式语法简练,功能强大,得到了许多 程序设计语言的支持,包括Java、C++、Perl以及Shell等。
基本正则表达式
元字符 | 案例 | 说明 |
^ | ^ro | 以字符 ro 开头 |
$ | ro$ | 以字符 ro 结尾 |
. | ro./.ro | 匹配字符 ro 和它后(前)一个字符 |
* | ro* | 匹配文件中的ro字符 |
[ ] | [ro] | 匹配字符 r 和 o |
[^] | [^ro] | 匹配除字符 r 和 o 以外的字符 |
^[ ] | ^[ro] | 匹配以字符 r 和 o 开头 |
\ | 转译字符 | |
{m,n} | ro\{2,3\} | 匹配字符 o 出现2-3次行 |
案例分析:
以字符 ro 开头/以字符 ro 结尾
匹配/etc/passwd文件中以字母 ro 开头的行并显示行号
[root@bogon ~]# grep -n ^ro /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
匹配/etc/passwd文件中以字母 ro 结尾的行并显示行号
[root@bogon ~]# grep -n ro$ /etc/passwd
匹配字符 ro 和它后(前)一个字符
匹配/etc/passwd文件中字符 ro 和它后面的一个字符
[root@bogon ~]# grep -n ro. /etc/passwd
匹配/etc/passwd文件中字符 ro 和它前面的一个字符
[root@bogon ~]# grep -n .ro /etc/passwd
匹配字符 r 和 o / 匹配除字符 r 和 o 以外的字符 / 匹配以字符 r 和 o 开头
匹配/etc/passwd文件中前2行的字符r和字符o
[root@bogon ~]# head -n 2 /etc/passwd | grep [ro]
匹配/etc/passwd文件中前2行除字符r和字符o以外的内容
[root@bogon ~]# head -n 2 /etc/passwd | grep [^ro]
匹配/etc/passwd文件中前2行以字符r或字符o开头的行
[root@bogon ~]# head -n 2 /etc/passwd | grep ^[ro]
匹配字符 o 出现2-3次行
搜索 /etc/passwd 文件中包含 "ro" 且 "ro" 后面跟着2-3个字符o的行。
[root@localhost ~]# grep "ro\{2,3\}" /etc/passwd
[root@localhost ~]# grep "ro\{1,3\}" /etc/passwd
注释:上述命令会匹配文件中"roo" 和 "rooo",但不会匹配 "ro" 或 "roooo"
扩展正则表达式
元字符 | 案例 | 说明 |
? | ro? | 匹配包含 "ro" 后面跟着零个或一个 "o" 的行 |
+ | ro+ | 匹配包含 "ro" 后面跟着至少一个或多个 "o" 的行。 |
(|) | (r|o) | 匹配包含字符 "r" 或 "o" 的行。 |
案例分析:
搜索/etc/passwd文件中包含r或ro且(这里的ro?意味着)r后面跟着0个或1个o的行。
[root@localhost ~]# head -n 5 /etc/passwd | grep -E "ro?"
搜索/etc/passwd文件中包含r或ro且(这里的ro+意味着)r后面跟着至少1个o的行
[root@localhost ~]# head -n 5 /etc/passwd | grep -E "ro+"
搜索/etc/passwd文件中包含r或o的行
[root@localhost ~]# head -n 5 /etc/passwd | grep -E "(r|o)"
三.文本编辑工具sed
Sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,处理时,把 当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处理缓冲区中的内容,处理完成 后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改 变。
基本语法:
sed 【参数】【定址符】【动作】文件
参数
参数 | 说明 |
-n | 只列出经过sed处理的内容 |
-i | 直接编辑原文件(默认将不对原文件处理) |
-e | 用于指定要执行的脚本或命令 案例:sed -e '命令1' -e '命令2' 文件名 |
-r | 使用扩展正则表达式 |
-f | 直接将sed的动作写在一个文件内 |
定址符号
动作命令
命令 | 说明 |
d (delete) | 删除匹配到的行 |
p(print) | 打印匹配到的行 |
a 文本 | 将文本内容添加到匹配行的下一行 |
i 文本 | 将文本内容添加到匹配行的上一行 |
c 文本内容 | 用文本内容替换匹配到的所有行 |
r | 读入文件内容追加到匹配行后面 |
R | 读入文件一行内容追加到匹配行后面 |
w 文件路径 | 将匹配到的内容另存到某个文件中 |
s/正则表达式/replacement/g | 根据正则表达式进行匹配,将匹配到的 内容替换为replacement,flag可以指 定g(表示全局替换,默认只替换每行第 一个)num1(表示对匹配到的第几个 内容进行替换),i(不区分大小 写),p(如果成功替换则打印) |
案例分析:
下面以/etc/passwd文件的前10行内容举例,内容如下:
[root@localhost sh]# head -5 /etc/passwd >> /zt/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例1:删除/etc/passwd文件中前三行的对应内容
删除passwd文件的1-3行内容
[root@localhost zt]# sed '1,3 d' passwd
删除passwd文件的1,3,5行内容
[root@localhost zt]# sed '1~2 d' passwd
删除文件中以r开头的行
[root@localhost zt]# sed '/^r/ d' passwd
案例2:添加hello到文件指定行的下一行(i与之相反不做赘述)
添加hello到文件第一行后面
[root@localhost zt]# sed '1 a hello' passwd
添加hello到文件第1和第2行后面
[root@localhost zt]# sed '1,2 a hello' passwd
添加hello到含有:2的行的下一行
[root@localhost zt]# sed -r '/:2+/ a hello' passwd
案例3:替换文件内容
将文件的第一行替换为hello
[root@localhost zt]# sed '1 c hello' passwd
替换文件含有字符:2的行为hello
[root@localhost zt]# sed -r '/:2+/ c hello' passwd
替换文件中的root为ROOT(默认只替换第一个匹配到的root)
[root@localhost zt]# sed 's/root/ROOT/' passwd
替换文件中所有的root为ROOT
[root@localhost zt]# sed 's/root/ROOT/' passwd
替换文件中所有的:号和它后面的一个字符为?号
[root@localhost zt]# sed 's/:./?/g' passwd
案例4:读取/另存文件内容
将文件test的1-3行内容另存到文件passwd中
[root@localhost zt]# sed '1,3 w passwd' test
#读取passwd文件的内容追加到test文件的第二行后面
[root@localhost zt]# sed '2 r passwd' test
四.文本处理工具awk
awk是Linux以及UNIX环境中现有的功能最强大的数据处理工具。简单地讲,awk是一种处理文本数据的 编程语言。awk的设计使得它非常适合于处理由行和列组成的文本数据。而在Linux或者UNIX环境中, 这种类型的数据是非常普遍的。
awk工作流程
(1)自动从指定的数据文件中读取行文本。
(2)自动更新awk的内置系统变量的值,例如列数变量NF、行数变量NR、行变量$0以及各个列变量 $1、$2等等。
(3)依次执行程序中所有的匹配模式及其操作。
(4)当执行完程序中所有的匹配模式及其操作之后,如果数据文件中仍然还有未读取的数据行,则返回 到第(1)步,重复执行(1)~(4)的操作。