平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“Shell 正则表达式及综合案例及文本处理工具”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
一串不包含特殊字符的正则表达式匹配它自己
例子,例如想要查看密码包含root字符串的,能够这样写
cat /etc/passwd | grep root

| 特殊字符 | 作用 |
| ^ | 匹配一行的开头 |
| $ | 匹配一行的结束 |
. | 匹配任意一个字符 |
| * | *不单独采用,他和上一个字符连用,表示匹配上一个字符0次或者多次 |
| [] | []表示匹配某个范围内的一个字符 |
| 表示转义字符,一般和特殊字符连用表示特殊字符本身 |
例1:匹配以a字符开头的:
cat /etc/passwd | grep ^a

例子2:匹配以e字符结尾
cat /etc/passwd | grep e$

例子3:匹配任一个字符
cat /ect/passwd | grep r.t
cat /ect/passwd | grep r..t

例子4:查询包含以字符r开头,t结尾的字符串
cat /etc/passwd | grep r.*t

[6,8] ------匹配6或者8
[0-9] ------匹配一个0-9 的数字
[0-9]* ------匹配任意长度的数字字符串
[a-z] ------匹配一个 a-z 之间的字符
[a-z]* -----匹配任意长度的字母字符串
[a-c,e-f] ---匹配 a-c 或者 e-f之间的任意字符
用法例子看下图吧:

例子6:假如说我们想查找n_test.sh文件包含$符的那这就需用到转义字符
cat /scripts/n_test.sh | grep '$'

结合项目来看,我们都知道手机号是由第一位数字是1,第二位是3,4,5,7,8,9;其余数字随便。总共十一位数字,所以我们能够得出
"1569656955" | grep ^1[3,4,5,7,8,9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$

理解这一步时,看上图能够得知,第一个数字符合手机号形式,而第二个明显不符合。但是这样【0-9】太多了,比较繁琐,我们就能够在后面用一个大括号表示出现次数来代替重复的0-9;但是要在正则表达式之前加入-E选项,如下所示:
grep -E ^1[3,4,5,7,8,9][0-9]{9}$

大于小于11位数字都是不符合的
实际生产应用中,往往需对重要的数据进行归档备份
需求:理解这一步时,实现一个目录归档备份的脚本,输入一个目录名称,将目录下所有文件按天归档保存,同时将归档日期附加在文档文件名上,放在根目录下(/archive)
这里用到的归档命令: tar
理解这一步时,后面能够加上 -c 选项表示归档,加上 -z 选项表示同时进行压缩得到的文件后缀名为 .tar.gz;不过需留意的是可能还是需加上P选项代表允许我们采用绝对路径进行归档。
#!/bin/bash
# 首先判断输入的参数个数是否为1
if [ $# -ne 1 ]
then
echo "参数个数错误!应该输入一个参数作为归档目录名"
exit
fi
# 从参数中获取目录名称,查看目录名称是否存在
if [ -d $1 ]
then
echo
else
echo
echo "目录不存在!"
echo
exit
fi
# 获取绝对路径
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1);pwd)
# 获取当前日期,归档文件名拼接成日期
DATE=$(date +%y%m%d)
# 订阅生成归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
# 订阅生成归档文件的路径
DEST=/archive/$FILE
# 开始归档目录文件
echo "开始归档...."
echo
# -c 归档 z 压缩 f可视化
tar -czPf $DEST $DIR_PATH/$DIR_NAME
# 判断上面文件归档文件操作是否成功
if [ $? -eq 0 ]
then
echo
echo "归档成功"
echo "归档的文件为:$DEST"
echo
else
echo "归档出现问题"
echo
fi
exit

例如我们想要1分钟归档文件一次;就能够设置定时器如下所示:
*/1 * * * * /archive/archive_test.sh /scripts

能够看得出确实添加了一个归档文件
cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。
cut 命令从文件的每行剪切字节、字符和字段同时将这些字节、字符和字段输出
基本用法
cut [选项参数] filename
选项参数
落到代码里,选项参数功能-f列号,提取第几列-d分隔符,按照指定分隔符分割列,默认是制表符"t"-c按字符进行切割,后加n表示取第几列 比如-c 1
比如一个文本文件有以下诗歌:

例如我们需提取第一列,那应该这样写,按空格指定分割第一列;如下所示:
cut -d " " -f 1 cut_test.txt

假如我们想要提取第一和第四列,能够这样写:
cut -d " " -f 1,4 cut_test.txt

在这个场景下,例如我们想知道ens33网卡的所有IP,那么首先应该是ifconfig ens33,随后管道符|,再然后正则表达式拿到ip 最后借助管道符切割。

因为ip在第十列,因此-f后面跟10;整体写法如下所示:
ifconfig ens33 | grep netmask | cut -d " " -f 10
落到代码里,一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理
基本用法
awk [选项参数] '/pattern1/{action1}/pattern2/{action2}...' filename
pattern:表示awk 在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
选项参数功能-F指定文件分割符-v分支一个用户定义变量
结合项目来看,不过有些版本的系统是不兼容awk工具的,那么如何查看自己系统是否兼容awk只需输入以下句子即可:
which awk

出现上面那段话说明你的系统是兼容awk工具的
cat /etc/passwd | awk -F ":" '/^root/ {print $7}'

cat /etc/passwd | awk -F ":" '/^root/ {print $1 "," $7}'

cat /etc/passwd | awk -F ":" '/^root/ {print $1"," $7} END{print "over"}'

4. 将passwd文件中的用户id增加数值1并输出
cat /etc/passwd | awk -F ":" '{print $3+1}'

实际处理时,变量说明FILENAME文件名NR已读记录数(行号)NF浏览记录的域的个数(切割后,列的个数)
示例操作
cat /etc/passwd | awk -F ":" '{print " 文件名:" FILENAME "t行号:" NR "t列数: " NR}' /etc/passwd

ifconfig | awk '/^$/ {print"空行: " NR}'

到此这篇关于Shell 正则表达式及综合案例及文本处理工具的文章就介绍到这了,更多相关Shell 正则表达式文本处理工具内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!