shell 正则表达式与文本处理处罚器

[复制链接]
发表于 2025-9-27 17:56:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
前言
一、正则表达式
(一)界说与用途
(二)底子正则表达式
(三)底子正则表达式元字符
(四)扩展正则表达式
二、文本处理处罚器:Shell 编程的得力助手
(一)sed 工具
(二)awk 工具


前言


在 Shell 编程范畴,正则表达式与文本处理处罚器是极为关键的技能,对于体系管理员、开辟职员以及数据分析师而言,纯熟把握这些技能,可以大概明显提拔文本处理处罚的服从和准确性,为编写高效、机动的 Shell 脚本奠基坚固底子。
一、正则表达式

(一)界说与用途

正则表达式(Regular Expression,简称 RE),又被称作正规表达式、通例表达式,在代码中常简写为 regex、regexp。它是一种使用单个字符串来形貌、匹配一系列符合特定句法规则字符串的强大工具 。在 Shell 编程中,正则表达式紧张用于文本的查找、更换、删除等操纵,广泛应用于文本编辑器、步伐筹划语言以及各类数据处理处罚场景。
(二)底子正则表达式

为深入明白底子正则表达式,我们预备一个名为 test.txt 的测试文件,内容如下:
  1. he was short and fat. He was wearing a blue polo shirt with black pants.The home
  2. of Football on BBC Sport online.
  3. the tongue is boneless but it breaks bones.12!
  4. google is the best tools for search keyword. The year ahead will test our political
  5. establishment to the limit. P1=3.141592653589793238462643383249901429
  6. a wood cross!
  7. Actions speak louder than words
  8. #woood #
  9. #woooooood #
  10. Axy zxyzxyzxyzC
  11. I bet this place is really spooky late at night!
  12. Misfortunes never come alone/single.
  13. I shouldn't have lett so tast.
复制代码


  • 查找特定字符:使用 grep 下令连合正则表达式可实现特定字符的查找。
比方,实验 “grep -n 'the' test.txt”,“-n” 选项用于体现行号,该下令会在 test.txt 文件中查找包罗 “the” 的行,并输出行号及匹配行内容 。若加上 “-i” 选项,即 “grep -in 'the' test.txt”,则表现不区分巨细写举行查找。若要反向选择,查找不包罗 “the” 字符的行,可使用 “grep -vn 'the' test.txt”,“-v” 选项表现反向匹配。

  • 使用中括号查找聚集字符:中括号 “[]” 在正则表达式中用于匹配聚集内的恣意一个字符。
好比,查找 “shirt” 与 “short” 这两个字符串,可实验 “grep -n'sh [io] rt' test.txt” ,由于 “[io]” 表现匹配 “i” 大概 “o”。查找包罗重复单个字符 “oo” 的行,实验 “grep -n 'oo' test.txt”。若要查找 “oo” 前面不是 “w” 的字符串,可使用聚集字符的反向选择 “[^]”,即 “grep -n '[^w] oo' test.txt”。查找包罗数字的行,实验 “grep -n '[0-9]' test.txt”。

  • ** 查找行首 “^” 与行尾字符 “:表现行首,” 表现行尾。
  1. “grep -n '^the' test.txt”             #查询以 “the” 字符串为行首的行        
  2. “grep -n '^[a-z]' test.txt”           #查询以小写字母开头的行
  3. “grep -n '^[A-Z]' test.txt”           #查询大写字母开头的行
  4. “grep -n '[a-zA-Z]' test.txt”         #查询不以字母开头的行
  5. “grep -n '^$' test.txt”                                                                #查询空白行
复制代码
查找以小数点 “.” 末了的行时,由于小数点在正则表达式中是元字符,需使用转义字符 “\”,即 “grep -n '.' test.txt”。

  • 查找恣意一个字符 “.” 与重复字符 “*”:在正则表达式中,小数点 “.” 代表恣意一个字符(除换行符外)。
比方,实验 “grep -n 'w..d' test.txt”,可查找以 “w” 开头、“d” 末了且中心有两个恣意字符的字符串。“” 代表重复零个或多个前面的单字符。如 “grep -n 'oo' test.txt”,“oo*” 表现第一个 “o” 必须存在,第二个 “o” 则是零个或多个 “o”。若查询包罗至少两个 “o” 以上的字符串,实验 “grep -n 'ooo*' test.txt”。查询以 “w” 开头 “d” 末了,中心包罗至少一个 “o” 的字符串,实验 “grep -n 'woo*d' test.txt”;查询以 “w” 开头 “d” 末了,中心的字符无关紧急的字符串,实验 “grep -n 'w.d' test.txt”。查询恣意数字所在行,实验 “grep -n '[0-9][0-9]' test.txt”。

  • 查找连续字符范围 “{}”:“{}” 用于限定重复字符的范围,在 Shell 中使用时需用转义字符 “\”。
比方:
  1. “grep -n 'o {2}' test.txt”         #查询两个 “o” 的字符
  2. “grep -n 'wo {2,5} d' test.txt”    #查询以 “w” 开头以 “d” 结尾,中间包含 2 - 5 个 “o” 的字符串
  3. “grep -n 'wo {2,} d' test.txt”     #查询以 “w” 开头以 “d” 结尾,中间包含 2 个或 2 个以上 “o” 的字符串
复制代码
(三)底子正则表达式元字符

常见的底子正则表达式元字符如下表所示:
字符
分析
|
将 | 前下令的输出作为 | 后下令的输入
^
匹配输入字符串的开始位置
$
匹配输入字符串的竣事位置
*
匹配前面的子表达式零次或多次
+
匹配前面的子表达式一次或多次
?
匹配前面的子表达式零次或一次
.
匹配除换行符(\n、\r)之外的任何单个字符
[a - z]
字符范围。匹配指定范围内的恣意字符
{n}
n 是一个非负整数,匹配确定的 n 次
{n,}
n 是一个非负整数,至少匹配 n 次
{n,m}
m 和 n 均为非负整数,此中 n <= m。最少匹配 n 次且最多匹配 m 次
\d
匹配一个数字字符。等价于 [0 - 9]
\D
匹配一个非数字字符。等价于 [^0 - 9]
\s
匹配任何空缺字符,包罗空格、制表符、换页符等等。等价于 [\n\t\v]
\S
匹配任何非空缺字符。等价于 [^\n\t\v]
\w
匹配字母、数字、下划线。等价于 '[A - Za - z0 - 9_]'
\W
匹配非字母、数字、下划线,等价于 '[^A - Za - z0 - 9_]'
\n
匹配一个换行符
\r
匹配一个换页符
\v
匹配一个回车符
(四)扩展正则表达式

在某些场景下,为简化指令,可使用扩展正则表达式。比方,查察见效的设置文件(清除空缺行与行首为 “#” 的行),使用底子正则表达式需实验 “grep -v '^' test.txt|grep -v '^\#'”,而使用扩展正则表达式,可简化为“egrep -v '^|^#' test.txt”,此中单引号内的管道符号 “|” 表现 “大概(or)” 。grep 下令仅支持底子正则表达式,若使用扩展正则表达式,需使用 egrep 或 awk 下令。egrep 下令与 grep 下令用法根本相似,可用于搜刮文件中的恣意字符串和符号。
扩展正则表达式常见元字符如下:
元字符
作用与示例
+
重复一个大概一个以上的前一个字符。
?
零个大概一个的前一个字符。
**
使用大概(or)的方式找出多个字符。
()
查找 “组” 字符串。
()+
辨别多个重复的组。
二、文本处理处罚器:Shell 编程的得力助手

在 Linux/UNIX 体系中,grep、sed、awk 被称为 Shell 编程的 “三剑客”,下面重点先容 sed 和 awk 这两个强大的文本处理处罚器。
(一)sed 工具

sed(Stream EDitor)是一款强大且简单的文天职析转换工具,可读取文本,并依据指定条件对文本内容举行编辑(如删除、更换、添加、移动等),末了输出全部行或仅输出处理处罚后的某些行。sed 常用于 Shell 脚本,以完成各种自动化处理处罚任务。

  • 工作流程与下令选项:sed 的工作流程包罗读取、实验和体现三个过程。读取时,sed 从输入流(文件、管道、尺度输入)读取一行内容并存储到临时缓冲区(模式空间);实验阶段,默认全部 sed 下令在模式空间次序实验,除非指定行所在;体现过程则将修改后的内容发送到输出流,之后模式空间被清空。常见的 sed 下令选项包罗:“-e” 或 “-expression=”,用于指定下令或脚原来处理处罚输入文本文件;“-f” 或 “-file=”,表现用指定的脚本文件处理处罚输入文本文件;“-h” 或 “--help”,用于体现资助信息;“-n”、“--quiet” 或 “silent”,仅体现处理处罚后的结果;“-i”,直接编辑文本文件。
  • 用法示例:以 test.txt 文件为例:
  1. “sed -n 'p' test.txt”         #可输出所有内容,等同于 “cat test.txt”;
  2. “sed -n '3p' test.txt”         #输出第 3 行;
  3. “sed -n '3,5p' test.txt”         #输出 3 - 5 行。
复制代码
连合正则表达式时:
  1. “sed -n '/the/p' test.txt”         #输出包含 “the” 的行;
  2. “sed -n '/the/=' test.txt”        #输出包含 “the” 的行所在的行号。
复制代码
在删除操纵方面,如:
  1. “sed '3d'”                                                                                                 #删除第 3 行;
  2. “sed '3,5d'”                                                                                         #删除 3 - 5 行;
  3. “sed '/cross/d'”                                                                         #删除包含 “cross” 的行。
  4. “sed '/^[a - z]/d' test.txt”                         #删除以小写字母开头的行
  5. “sed '/./d' test.txt”                                                        #删除以 “.” 结尾的行
  6. “sed -e '/^/{n;/^/d}' test.txt”         #删除重复的空行 其效果与“cat -s test.txt”相同
复制代码
更换操纵中:
  1. “sed 's/the/THE/' test.txt”                #将每行中的第一个“the”替换为“THE”;
  2. “sed 's/the/THE/g' test.txt”        #将文件中的所有“the”替换为“THE”;
  3. “sed 's/o//g' test.txt”                                #将文件中的所有“o”删除(替换为空串)。
复制代码
迁徙操纵时:
  1. “sed '/the/{H;d};G' test.txt”                 #将包含 “the” 的行迁移至文件末尾;
  2. “sed '/the/w out.file' test.txt”  #将包含 “the” 的行另存为文件 out.file。
复制代码
别的,复杂操纵可通过脚本文件实现。比方,将第 1 - 5 行内容转移至第 17 行后,可先创建脚本文件 opt.list,内容为 “1,5H”“1,5d”“17G”,再实验 “sed -f opt.list test.txt”。

  • 案例:编写脚本调解 vsftpd 服务设置,克制匿名用户,答应本地用户(也答应写入)。示例脚本如下:
  1. #!/bin/bash
  2. # 指定样本文件路径、配置文件路径
  3. SAMPLE="/usr/share/doc/vsftpd - 3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf"
  4. CONFIG="/etc/vsftpd/vsftpd.conf"
  5. # 备份原来的配置文件,检测文件名为/etc/vsftpd/vsftpd.conf.bak备份文件是否存在,若不存在则使用cp命令进行文件备份
  6. [! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak
  7. # 基于样本配置进行调整,覆盖现有文件
  8. sed -e '/anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
  9. sed -i -e '/^local_enable/s/NO/YES/g' -e '/write_enable/s/NO/YES/g' $CONFIG
  10. grep "listen" $CONFIG || sed -i '\alisten=YES' $CONFIG
  11. # 启动vsftpd服务,并设为开机后自动运行
  12. systemctl restart vsftpd
  13. systemctl enable vsftpd
复制代码
(二)awk 工具

awk 是 Linux/UNIX 体系中功能强大的编辑工具,可逐行读取输入文本,根据指定的匹配模式举行查找,对符合条件的内容举行格式化输出或过滤处理处罚,广泛应用于 Shell 脚本以完成自动化设置任务。

  • 下令格式与根本概念:awk 的下令格式为:
“awk 选项 ' 模式或条件 {编辑指令}' 文件 1 文件 2...”,也可通过 “-f” 读取脚本对目的文件举行处理处罚。
awk 倾向于将一行分成多个 “字段” 举行处理处罚,默认字段分隔符为空格或 tab 键,实验结果可通过 print 功能打印体现。awk 还支持逻辑操纵符:“&&”(表现 “与”)、“||”(表现 “或”)、“!”(表现 “非”)以及简单的数学运算(如 +、-、*、/、%、^ 分别表现加、减、乘、除、取余和乘方)。
awk 包罗几个特殊的内建变量:


  • FS(指定每行文本的字段分隔符,默以为空格或制表位)
  • NF(当前处理处罚的行的字段个数)
  • NR(当前处理处罚的行的行号)
  • $0(当前处理处罚的行的整行内容)
  • $n(当前处理处罚行的第 n 个字段)
  • FILENAME(被处理处罚的文件名)
  • RS(数据纪录分隔,默以为 \n,即每活动一条纪录)

  • 用法示例:按行输出文本时:
  1. “awk '{print}' test.txt”                                                    #或 “awk '{print 0}' test.txt”输出所有内容
  2. “awk 'NR1,NR3{print}'                                            #test.txt”输出1 - 3行内容
  3. “awk 'BEGIN {x=0};/\/bin\/bash/{x++};END {print x}' /etc/passwd”  #统计以 “/bin/bash” 结尾的行数。
复制代码
按字段输出文本时:
  1. “awk '{print $3}' test.txt”                                                                                                #输出每行中(以空格或制表位分隔)的第3个字段
  2. “awk -F ":" '$7~"/bash"{print $1}' /etc/passwd”         #输出以冒号分隔且第 7 个字段中包含 “/bash” 的行的第 1 个字段。
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表