Bootstrap

Shell之文本三剑客

文章目录


前言

awksedgrep不仅是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读入文件一行内容追加到匹配行后面
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)的操作。

参考链接


总结

;