目录
[利用中括号"[]" 来查找字符](#利用中括号“[]” 来查找字符)
[查找行首"^"与行尾字符""](#查找行首“^”与行尾字符“”)
正则表达式
正则表达式的定义
正则表达式(正规表达式,常规表达式)在代码中简写为regex,regexp或re。正则表达式是一种匹配字符串的方法,通过特殊符号等实现快速查找。
正则表达式用途
在Shell编程中,正则表达式主要用于文本搜索、替换和字符串操作,例如在grep、awk、sed等命令中广泛应用,以实现对文本的高效处理。
基础正则表达式
正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式。基础正则表达式是常用正则表达式最基础的部分。
基础正则表达式示例
需提前准备一个test.txt文件
[root@localhost ~]# cat test.txt
he was short and fat. He was wearing a blue poloshirt with black pants. The home
of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword. The yyear ahead will test our political
establishment to the limit. PI=3.141592653589793238462643383249901429
查找特定字符
在查找特定字符的命令格式中,-n表示行号,-i表示不区分大小写。
[root@localhost ~]# grep -n 'the' test.txt
4:the tongue is boneless but it breaks bones.12!
5:google is the best tools for search keyword. 6:Theyear ahead will test our political
establishment to the limit.
[root@localhost ~]# grep -in 'test.txt
3:The home of Football on BBC Sport online. 4:the torngue is boneless but it breaks
如反向选择,查找不到the,则通过grep命令中-v和-n实现 。
[root@localhost ~]# grep -n 'the' test.txt
4:the tongue is boneless but it breaks bones.12!
5:google is the best tools for search keyword. 6:Theyear ahead will test our political
establishment to the limit.
[root@localhost ~]# grep -in 'test.txt
3:The home of Football on BBC Sport online. 4:the torngue is boneless but it breaks
利用中括号"[]" 来查找字符
想要shirt,short时,这俩个字符都有sh与rt。其中"[]"中无论有几个字符,都仅代表一个字符。
[root@localhost ~]# grep -n 'sh[io]rt' test.txt
1:he was short and fat. 2:He was wearing a bluee polo shirt with black pants.
若查找包含重复单个字符"oo"时,执行
[root@localhost ~]# grep -n 'oo' test.txt
3:The home of Football on BBC Sport online. 5:google is the best tools for search
keyword. 8:a wood cross!
11:#woood #
12:#woooooood #
14:I bet this place is really spooky late at night!
若查找"oo"前面不是"w"的字符串,只需要通过集合字符的反向选择"[^]"来实现该目的。
[root@localhost ~]# grep -n '[^w]oo' test.txt
3:The home of Football on BBC Sport online.
5:google is the best tools for search keyword.
10:#woood #
11:#woooooooood #
13:I bet this place is really spooky late at night!
若不希望"oo"前面存在小写字母,可以使用"grep-n'「^a-z]oo'test.txt"命令实现,其中a-z"表示小写字母,大写字母则通过"A-Z"表示。
[root@localhost ~]# grep -n '[^a-z]oo' test.txt
3:The home of Football on BBC Sport online.
如是数字则执行
[root@localhost ~]# grep -n '[0-9]' test.txt
4:the tongue is boneless but it breaks bones.12!
6:PI=3.14
查找行首"^"与行尾字符"$"
基础正则表达式包含两个定位元字符:"^"(行首)与"$"(行尾)。在上面的示例中,查询"the"字符串时出现了很多包含"the"的行,如果想要查询以"the"字符串为行首的行,则可以通过"^"元字符来实现。
[root@localhost ~]# grep -n '^the' test.txt
4:the tongue is boneless but it breaks bones.12!
查询以小写字母开头的行可以通过"^[a-z]"规则来过滤,查询大写字母开头的行则使用"^[A-Z]"规则,若查询不以字母开头的行则使用"^[^a-zA-Z]"规则。
[root@localhost ~]# grep -n '^[a-z]' test.txt
1:he was short and fat.
2:he was weating a blue polo shirt with black pants.
4:the tongue is boneless but it breaks bones.12!
5:google is the best tools for search keyword.
7:a wood cross!
[root@localhost ~]# grep -n '^[A-Z]' test.txt
3:The home of Football on BBC Sport online.
6:PI=3.14
8:Actions speak louder than words
12:AxyzxyzxyzxyzC
13:I bet this place is really spooky late at night!
14:Misfortunes never come alone/single.
15:I shouldn't have lett so tast.
[root@localhost ~]# grep -n '^[^a-zA-Z]' test.txt
10:#woood #
11:#woooooooood #
[root@localhost ~]# grep -n '\.$' test.txt
1:he was short and fat.
2:he was weating a blue polo shirt with black pants.
3:The home of Football on BBC Sport online.
5:google is the best tools for search keyword.
14:Misfortunes never come alone/single.
15:I shouldn't have lett so tast
如需查找空白行时,执行grep -n '^$' test.txt即可。
查找任意一个字符"."与重复字符"*"
正则表达式中小数点.也是一个字符,代表任意一个字符。
列:要查找以w开头d结尾则执行grep -n 'w..d' test.txt即可
如需查询包含至少俩个o以上的字符串,则执行"gerp -n 'ooo* test.txt'
查询以w开头d结尾时(中间的字符可有可无的字符串)。执行grep -n 'w.*d' test.txt。
查询任意数字所在行,执行grep -n '[0-9][0-9]*' test.txt即可
查找连续字符范围"{}"
查询俩个o字符,执行gerp -n 'o\{2\}' test.txt即可
查询以w开头d结尾,中间包含2~5个o的字符串,执行gerp -n 'wo\{2,\}' test.txt即可。
元字符总结
常见的基础正则表达式的元字符如下;
\:将下一个字符标记为一个特殊字符,或一个原义字符,或一个向后引用,一个八进制义符。
^:匹配输入字符串开始的位置
*:匹配前面的子表达式零次或多次
$:匹配字符串结束位置
+:匹配前面的子表达式一次或多次
?:匹配前面的子表达式零次或一次
.:匹配除换行字符(\n,\r)之外的任何单个字符
a-z\]:字符范围。匹配指定的字符范围 {n}:n是一个非负整数,匹配确定n次 {n,}:n是非负整数,至少匹配n次 \\d:匹配一个数字字符。等于\[0-9
\D:匹配一个非数字字符。等于[^0-9]
\s:匹配任何空白字符,包括空格,字符表等。等于[\f\n\r\t\v]
\S:匹配任何非空白字符。等于[^\f\n\t\t\v]
\w:匹配字母,数字,下划线等。等价于[A-Za-z0-9_]
\W:匹配非字母,数字,下划线。等价于[^A-Za-z0-9_]
\n匹配一个换行符
\f匹配一个换页符
\r匹配一个回车符
扩展正则表达式
|-----|------------------|--------------------------------|
| 元字符 | 作用 | 示例 |
| + | 重复一个或者一个以上的前一个字符 | "egrep -n 'wo+d' test.txt" |
| ? | 零个或者一个的前一个字符 | "egrep -n 'bes?t' test.txt" |
| | | 使用或者的方式找出多个字符 | "egrep -n 'oflislon' test.txt" |
| () | 查找"组"字符串 | "egrep -n 't(ale)st' test.txt" |
| ()+ | 辨别多个重复的组 | "egrep -n 'A(xyz)+C' test.txt" |
文本处理器
sed工具
sed(Stream EDitor)是一个强大而简单的文本解析转换]工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。
sed的工作流程主要包括读取、执行和显示三个过程:
读取:sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称
模式空间,patternspace)。
执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed
命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空
sed [选项] '操作' 参数
sed [选项] -f scriptfile 参数
常见的sed命令选项主要包含以下几种。
-e或--expression=:表示用指定命令或者脚本来处理输入的文本文件
-f或--file=:表示用指定的脚本文件来处理输入的文本文件。
-h或--help:显示帮助。
-n、--quiet或silent:表示仅显示处理后的结果。
-i:直接编辑文本文件。
"操作"用于指定对文件操作的动作行为,也就是sed的命令。通常情况下是采用的"[n1[,n2]]"操作参数的格式。
a:增加,在当前行下面增加一行指定内容。
C:替换,将选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,其通常与"-n"选项一起使使用。
s:替换,替换指定字符。
y:字符转换。
输出符合条件的文本(p表示正常输出)
执行sed -n '[需要输出的行数]p' test.txt即可
删除符合条件的文本(d)
如要删除文件。执行nl test.txt | sed '[参数]d'
如要删除包含指定字符的行执行nl test.txt | sed '/字符名/d'
如要删除以小写字母开头的行执行sed '/^[a-z]/d' test.txt
删除以"."结尾的行执行sed '/\.$/d' test.txt
删除空行执行sed '/^$/d' test.txt
替换符合条件的文本
在使用sed命令进行替换操作时需要用到s(字符串替换)、c(整行/整块替换)、y(字符转换)命令字符。
将每行中的第一个the替换为THE执行 sed 's/the/THE\' test.txt
将每行中的第2个1替换为L 执行 sed 's/1/L/2' test.txt
将文件中的所有 the替换为THE 执行 sed 's/the/THE/g' test.txt
将文件中的所有 o删除(替换为空串) 执行 sed 's/o//g' test.txt
迁移符合条件的文本
在使用sed命令迁移符合条件的文本时,常用到以下参数:
H:复制到剪贴板;
g、G:将剪贴板中的数据覆盖/追加至指定行;
W:保存为文件;
r:读取指定文件;
a:追加指定内容。
示例:
将包含the的行迁移至文件末尾,{;}用于多个操作 执行 sed '/the/{H;d};$G' test.txt
将第1~5行内容转移至第17行后 执行 sed '1,5{H;d};17G' test.txt
将包含the的行另存为文件 out.file 执行 sed '/the/w out.file' test.txt
将文件/etc/hostname的内容添加到包含 the 的每行以后 执行 sed '/the/r /etc/hostname' test.txt
在第3行后插入一个新行,内容为New 执行 sed '3aNew' test.txt
使用脚本编辑文件
使用sed脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过"-f"选项来调用。
示例:将1~5行移动到17行后
sed '1,5{H;d};17G' test.txt
sed直接操作文件示例
编写一个脚本,用来调整vsftpd服务配置,要求禁止匿名用户,但允许本地用户(也允许写入)。
执行vim aaa.sh输入
#!/bin/bash
#指定样本文件路径、配置文件路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf"
CONFIG="/etc/vsftpd/vsftpd.conf"
#备份原来的配置文件,检测文件名为/etc/vsftpd/vsftpd.conf.bak各份文件是否存在,若不
#存在则使用cp命令进行文件备份
[!-e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak
#基于样本配置进行调整,覆盖现有文件
sed -e\'/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG
grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG || sed -i sed -i '$FIG
#启动vsftpd服务,并设为开机后自动运行
systemctl restart vsftpd
systemctl enable vsftpd
chomd +x aaa.sh
awk工具
在Linux/UNIX系统中,awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于Shell脚本,完成各种自动化配置任务。
awk选项"模式或条件{编辑指令}'文件1文件 2...
//过滤并输出文件中符合条件的内容
awk-f脚本文件 文件 文件 1 文件 2 ...
//从脚本中调用编辑指令,过滤并输出内容
awk包含几个特殊的内建变量(可直接用)如下所示:
FS:指定每行文本的字段分隔符,默认为空格或制表位。
NF:当前处理的行的字段个数。
NR:当前处理的行的行号(序数)。
0:当前处理的行的整行内容。
n:当前处理行的第 n个字段(第 n 列)。
FILENAME:被处理的文件名。
RS:数据记录分隔,默认为\n,即每行为一条记录。
按行输出文本
awk '{print}' test.txt 输出所有内容,等同于cat test.txt
awk '{print $0}' test.txt 输出所有内容,等同于cat test.txt
awk 'NR==1,NR==3{print}' test.txt 输出第1~3行内容
awk'(NR>=1)&&(NR<=3){print}' test.txt 输出第1~3行内容
awk 'NR==1||NR==3{print}' test.txt 输出第1行、第3行内容
awk '(NR%2)==1{print}' test.txt 输出所有奇数行的内容
awk '(NR%2)==0{print}' test.txt 输出所有偶数行的内容
awk '/root/{print}' /etc/passwd 输出以root开头的行
awk '/nologin$/{print}' /etc/passwd 输出以nologin结尾的行
按字段输出文本
awk '{print 3}' test.txt 输出每行中(以空格或制表位分隔)的第3个字段
awk'{print1,3}'test.txt 输出每行中的第1、3个字段
awk -F ":" '2==""{print}' /etc/shadow 输出密码为空的用户的shadow记录
awk 'BEGIN {FS=":"}; 2==""{print}' /etc/shadoW 输出密码为空的用户的shadow记录
awk -F ":" '7~"/bash"{print 1}' /etc/passwd 输出以冒号分隔且第7个字段中包含/bash的行的第1个字字段
awk '(1~"nfs")&&(NF=8){print 1,2}'/etc/services 输出包含8个字段且第1个字段中包含nfs的行的第1、2个字段
通过管道,双引号调用shell命令
awk -F: '/bash/{print \| "wc -l"}' /etc/passwd 调用wc-1命令统计使用bash的用户个数,等同于grep-c awk 'BEGIN {while ("w" \| getline) n++ ; {print n-2}t) 调用w命令,并用来统计在线用户数 awk "BEGIN { "hostname" \| getline ; print 0}" 调用hostname,并输出当前的主机名