正则表达式又称正规表达式、常规表达式。在代码中常简写为 regex、regexp 或 RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹 配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进 行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指 那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符 前面的字符)在目标对象中的出现模式。
正则表达式一般用于脚本编程与文本编辑器中。很多文本处理器与程序设计语言均支持正则表达式,例如 Linux 系统中常见的文本处理器(grep、egrep、sed、awk)以及应用比较广泛的 Python 语言。正则表达式具备很强大的文本匹配功能,能够在文本海洋中快速高效地处理文本。
对于一般计算机用户来说,由于使用到正则表达式的机会不多,所以无法体会正则表达 式的魅力,而对于系统管理员来说,正则表达式则是必备技能之一。
正则表达式对于系统管理员来说是非常重要的,系统运行过程中会产生大量的信息,这些信息有些是非常重要的,有些则仅是告知的信息。身为系统管理员如果直接看这么多的信息数据,无法快速定位到重要的信息,如“用户账号登录失败”“服务启动失败”等信息。这时可以通过正则表达式快速提取“有问题”的信息。如此一来,可以将运维工作变得更加简单、方便。
首先来介绍几个可选项:-n,代表显示行号;-i代表不区分大小写;-v代表反向匹配,接下来看几个示例:
1、在abc.txt文件中查找不包含“text”的行,并显示行号
[root@localhost opt]# grep -nv 'text' abc.txt
2、查找text和test两个字符串,并显示行号
[root@localhost opt]# grep -n 'te[xs]t' abc.txt
3、查找“bcd”前面不是“a”的字符串,并显示行号
[root@localhost opt]# grep -n '[^a]bcd' abc.txt
4、查找以小写字母为开头的行,并显示行号
[root@localhost opt]# grep -n '^[a-z]' abc.txt
5、查找不以字母为开头的行,并显示行号
[root@localhost opt]# grep -n '^[^a-zA-Z]' abc.txt
ps:"^"符号在元字符集合"[]"内外的作用是不一样的,在"[]"符号内表示反向选择,在"[]"符号外则表示定为行首。反之,若想查找以某一特定字符结尾的行则可以使用"$"定位符。
6、查找以小数点(.)为结尾的行,并显示行号
[root@localhost opt]# grep -n '\.$' abc.txt
7、查找空白行,并显示行号
[root@localhost opt]# grep -n '^$' abc.txt
8、查找“w??d”的字符串,并输出行号
[root@localhost opt]# grep -n 'w..d' abc.txt
ps:意思是该字符串有四个字符,以w开头d结尾
9、查找第一个字符是t,字符h有没有或有多个的字符串,并显示行号
[root@localhost opt]# grep -n 'th*' abc.txt
10、查找以t开头,e结尾,中间可有可无的字符串,并显示行号
[root@localhost opt]# grep -n 't.*e' abc.txt
11、查找以w开头,d结尾,中间包含2-5个o的字符串
[root@localhost opt]# grep -n 'wo\{2,5\}d' abc.txt
元字符 | 作用 |
---|---|
^ | 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配“^” 字符本身,请使用“^” |
$ | 匹配输入字符串的结尾位置。如果设置了RegExp 对象的 Multiline 属性,则“KaTeX parse error: Undefined control sequence: \n at position 6: ”也匹配‘\̲n̲’或‘\r’。要匹配“”字符本身,请使用“$” |
. | 匹配除“\r\n”之外的任何单个字符 |
\ | 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义 |
* | 匹配前面的子表达式零次或多次。要匹配“*”字符,请使用“*” |
[] | 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a” |
[^] | 赋值字符集合。匹配未包含的一个任意字符。例如,“[^abc]”可以匹配“plain”中任何一个字母 |
[n1-n2] | 字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意一个小写字母字符。 注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示字符的范围;如果出现在字符组的开头,则只能表示连字符本身 |
{n} | n 是一个非负整数,匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的“oo” |
{n,} | n 是一个非负整数,至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*” |
{n,m} | m 和 n 均为非负整数,其中 n<=m,最少匹配 n 次且最多匹配m 次 |
grep命令仅支持基础正则表达式,如果想使用扩展正则表达式,那么就要用到它的好兄弟egrep了。
元字符 | 作用 |
---|---|
+ | 重复一个或者一个以上的前一个字符 |
? | 零个或者一个的前一个字符 |
| | 使用或者(or)的方式找出多个字符 |
() | 查找“组”字符串 |
()+ | 辨别多个重复的组 |
1、"+",查找第一个字符是w,最后一个字符是d,中间有一个或一个以上o的字符串,并输出行号
[root@localhost opt]# egrep -n 'wo+d' abc.txt
2、"?",查找”bet“、”best“这两个字符串并输出行号
[root@localhost opt]# egrep -n 'bes?t' abc.txt
3、"|",查找"if"或者"at"或者"on"字符串并输出行号
[root@localhost opt]# egrep -n 'if|at|on' abc.txt
4、"()",查找“test"或"tast"字符串并输出行号
[root@localhost ~]# egrep -n 't(a|e)st' abc.txt
5、"()+",查找开头是“A”结尾是“C”,中间有一个以上的“xyz”字符串,并输出行号
[root@localhost ~]# egrep -n 'A(xyz)C' abc.txt
sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed 也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于 Shell 脚本中,用以完成各种自动化处理任务。
sed 的工作流程主要包括读取、执行和显示三个过程。
读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
sed [选项] '操作' 参数
sed [选项] -f scriptfile 参数
常见的sed命令选项主要包括:
常见sed命令操作项包括:
例:
1、输出文件所有内容
[root@localhost ~]# sed -n 'p' abc.txt
2、输出文件第3-5行
[root@localhost ~]# sed -n '3,5p' abc.txt
3、输出所有奇数行(n代表读取下一行,下同)
[root@localhost ~]# sed -n 'p;n' abc.txt
4、输出所有偶数行
[root@localhost ~]# sed -n 'n;p' abc.txt
5、输出1-5行之间所有的奇数行
[root@localhost opt]# sed -n '1,5{p;n}' abc.txt
6、输出所有包含“the”的行
[root@localhost opt]# sed -n '/the/p' abc.txt
7、输出从第 4 行至第一个包含 the 的行
[root@localhost opt]# sed -n '4,/the/p' abc.txt
8、输出包含“the”字符串所在行的行号
[root@localhost opt]# sed -n '/the/=' abc.txt
9、输出以“he”结尾的行
[root@localhost opt]# sed -n '/the$/p' abc.txt
10、输出包含单词wood 的行
[root@localhost opt]# sed -n '/\/p' abc.txt
11、删除文件第3行
[root@localhost opt]# nl abc.txt | sed '3d'
12、删除以小写字母开头的行
[root@localhost opt]# sed '/^[a-z]/d' abc.txt
13、删除所有以“.”结尾的行
[root@localhost opt]# sed '/\.$/d' abc.txt
14、删除重复的空行(连续空行只保留一个)
[root@localhost opt]# sed -e '/^$/{n;/^$/d}' abc.txt
15、将文件中的所有"the"替换为"THE"
[root@localhost opt]# sed 's/the/THE/g' abc.txt
16、在每行行首插入#号
[root@localhost opt]# sed 's/^/#/' abc.txt
17、将第 3~5 行中的所有 the 替换为 THE
[root@localhost opt]# sed '3,5s/the/THE/g' abc.txt
迁移符合条件的文本
例:
1、将包含the 的行迁移至文件末尾
[root@localhost opt]# sed '/the/{H;d};$g' abc.txt
2、将第 1~5 行内容转移至第 17 行后
[root@localhost opt]# sed '1,5{H;d};15G' abc.txt
3、在第 3 行后插入一个新行,内容为New
[root@localhost opt]# sed '3aNEW' abc.txt
4、将包含the 的行另存为文件,名称为other.txt
[root@localhost opt]# sed '/the/w other.txt' abc.txt
在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。
awk包含几个特殊的内建变量:
例:
1、输出文件所有内容
[root@localhost opt]# awk '{print}' abc.txt
或
[root@localhost opt]# awk '{print $0}' abc.txt
2、输出1-3行内容
[root@localhost opt]# awk 'NR==1,NR==3{print}' abc.txt
3、输出文件中所有奇数行内容
[root@localhost opt]# awk '(NR%2)==1{print}' abc.txt
4、输出所有以the开头的行
[root@localhost opt]# awk '/^the/{print}' abc.txt
5、统计以空行分隔的文本段落数
[root@localhost opt]# awk 'BEGIN{RS=""};END{print NR}' 1.txt
6、统计系统在线用户数
[root@localhost opt]# awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'
7、输出当前主机名
[root@localhost opt]# awk 'BEGIN { "hostname" | getline ; print $0}'
在 Linux 系统中,常用的文件排序工具有三种:sort、uniq、wc。sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样。sort 命令的语法为“sort [选项] 参数”,其中常用的选项包括以下几种。
例:
1、对账户文件passwd进行排序
[root@localhost opt]# sort /etc/passwd
2、对passwd文件中的第三列进行排序
[root@localhost opt]# sort -t ':' -rk 3 /etc/passwd
Uniq 工具在 Linux 系统中通常与 sort 命令结合使用,用于报告或者忽略文件中的重复行。具体的命令语法格式为:uniq [选项] 参数。其中常用选项包括以下几种:
例:
1、删除abc.txt文件中重复的行,并在行首显示重复次数
[root@localhost opt]# uniq -c 1.txt
2、查找abc.txt文件中重复的行
[root@localhost opt]# uniq -d 1.txt
tr 命令常用来对来自标准输入的字符进行替换、压缩和删除。可以将一组字符替换之后变成另一组字符,经常用来编写优美的单行命令,作用很强大。
tr 具体的命令语法格式为:
tr [选项][参数]
其常用选项包括以下内容:
例:
1、将大写的ABC转化为小写
[root@localhost opt]# echo "ABC" | tr 'A-Z' 'a-z'
2、删除字符串中的某些字符
[root@localhost opt]# echo "ABC" | tr -d 'B'
3、压缩输入中的重复字符(将多个重复变成一个)
[root@localhost opt]# echo "ABBBBBBBBC" | tr -s 'B'
.7 tr工具
tr 命令常用来对来自标准输入的字符进行替换、压缩和删除。可以将一组字符替换之后变成另一组字符,经常用来编写优美的单行命令,作用很强大。
tr 具体的命令语法格式为:
tr [选项][参数]
其常用选项包括以下内容:
例:
1、将大写的ABC转化为小写
[root@localhost opt]# echo "ABC" | tr 'A-Z' 'a-z'
2、删除字符串中的某些字符
[root@localhost opt]# echo "ABC" | tr -d 'B'
3、压缩输入中的重复字符(将多个重复变成一个)
[root@localhost opt]# echo "ABBBBBBBBC" | tr -s 'B'