马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
目次
前言
一、正则表达式
(一)界说与用途
(二)底子正则表达式
(三)底子正则表达式元字符
(四)扩展正则表达式
二、文本处理处罚器:Shell 编程的得力助手
(一)sed 工具
(二)awk 工具
前言
在 Shell 编程范畴,正则表达式与文本处理处罚器是极为关键的技能,对于体系管理员、开辟职员以及数据分析师而言,纯熟把握这些技能,可以大概明显提拔文本处理处罚的服从和准确性,为编写高效、机动的 Shell 脚本奠基坚固底子。
一、正则表达式
(一)界说与用途
正则表达式(Regular Expression,简称 RE),又被称作正规表达式、通例表达式,在代码中常简写为 regex、regexp。它是一种使用单个字符串来形貌、匹配一系列符合特定句法规则字符串的强大工具 。在 Shell 编程中,正则表达式紧张用于文本的查找、更换、删除等操纵,广泛应用于文本编辑器、步伐筹划语言以及各类数据处理处罚场景。
(二)底子正则表达式
为深入明白底子正则表达式,我们预备一个名为 test.txt 的测试文件,内容如下:
- he was short and fat. He was wearing a blue polo shirt 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 year ahead will test our political
- establishment to the limit. P1=3.141592653589793238462643383249901429
- a wood cross!
- Actions speak louder than words
- #woood #
- #woooooood #
- Axy zxyzxyzxyzC
- I bet this place is really spooky late at night!
- Misfortunes never come alone/single.
- 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”。
- ** 查找行首 “^” 与行尾字符 “:表现行首,” 表现行尾。
- “grep -n '^the' test.txt” #查询以 “the” 字符串为行首的行
- “grep -n '^[a-z]' test.txt” #查询以小写字母开头的行
- “grep -n '^[A-Z]' test.txt” #查询大写字母开头的行
- “grep -n '[a-zA-Z]' test.txt” #查询不以字母开头的行
- “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 中使用时需用转义字符 “\”。
比方:
- “grep -n 'o {2}' test.txt” #查询两个 “o” 的字符
- “grep -n 'wo {2,5} d' test.txt” #查询以 “w” 开头以 “d” 结尾,中间包含 2 - 5 个 “o” 的字符串
- “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 文件为例:
- “sed -n 'p' test.txt” #可输出所有内容,等同于 “cat test.txt”;
- “sed -n '3p' test.txt” #输出第 3 行;
- “sed -n '3,5p' test.txt” #输出 3 - 5 行。
复制代码 连合正则表达式时:
- “sed -n '/the/p' test.txt” #输出包含 “the” 的行;
- “sed -n '/the/=' test.txt” #输出包含 “the” 的行所在的行号。
复制代码 在删除操纵方面,如:
- “sed '3d'” #删除第 3 行;
- “sed '3,5d'” #删除 3 - 5 行;
- “sed '/cross/d'” #删除包含 “cross” 的行。
- “sed '/^[a - z]/d' test.txt” #删除以小写字母开头的行
- “sed '/./d' test.txt” #删除以 “.” 结尾的行
- “sed -e '/^/{n;/^/d}' test.txt” #删除重复的空行 其效果与“cat -s test.txt”相同
复制代码 更换操纵中:
- “sed 's/the/THE/' test.txt” #将每行中的第一个“the”替换为“THE”;
- “sed 's/the/THE/g' test.txt” #将文件中的所有“the”替换为“THE”;
- “sed 's/o//g' test.txt” #将文件中的所有“o”删除(替换为空串)。
复制代码 迁徙操纵时:
- “sed '/the/{H;d};G' test.txt” #将包含 “the” 的行迁移至文件末尾;
- “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 服务设置,克制匿名用户,答应本地用户(也答应写入)。示例脚本如下:
- #!/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
- # 启动vsftpd服务,并设为开机后自动运行
- systemctl restart vsftpd
- systemctl enable vsftpd
复制代码 (二)awk 工具
awk 是 Linux/UNIX 体系中功能强大的编辑工具,可逐行读取输入文本,根据指定的匹配模式举行查找,对符合条件的内容举行格式化输出或过滤处理处罚,广泛应用于 Shell 脚本以完成自动化设置任务。
“awk 选项 ' 模式或条件 {编辑指令}' 文件 1 文件 2...”,也可通过 “-f” 读取脚本对目的文件举行处理处罚。
awk 倾向于将一行分成多个 “字段” 举行处理处罚,默认字段分隔符为空格或 tab 键,实验结果可通过 print 功能打印体现。awk 还支持逻辑操纵符:“&&”(表现 “与”)、“||”(表现 “或”)、“!”(表现 “非”)以及简单的数学运算(如 +、-、*、/、%、^ 分别表现加、减、乘、除、取余和乘方)。
awk 包罗几个特殊的内建变量:
- FS(指定每行文本的字段分隔符,默以为空格或制表位)
- NF(当前处理处罚的行的字段个数)
- NR(当前处理处罚的行的行号)
- $0(当前处理处罚的行的整行内容)
- $n(当前处理处罚行的第 n 个字段)
- FILENAME(被处理处罚的文件名)
- RS(数据纪录分隔,默以为 \n,即每活动一条纪录)
- “awk '{print}' test.txt” #或 “awk '{print 0}' test.txt”输出所有内容
- “awk 'NR1,NR3{print}' #test.txt”输出1 - 3行内容
- “awk 'BEGIN {x=0};/\/bin\/bash/{x++};END {print x}' /etc/passwd” #统计以 “/bin/bash” 结尾的行数。
复制代码 按字段输出文本时:
- “awk '{print $3}' test.txt” #输出每行中(以空格或制表位分隔)的第3个字段
- “awk -F ":" '$7~"/bash"{print $1}' /etc/passwd” #输出以冒号分隔且第 7 个字段中包含 “/bash” 的行的第 1 个字段。
复制代码 |