正则表达式与Shell文本处理练习 文章目录一、正则表达式基本正则扩展正则二、练习一、正则表达式正则表达式是通过一些特殊字符的排列用以查找、替换、删除一行或多行文字字符串。基本正则基础元字符元字符描述示例\转义符将特殊字符进行转义忽略其特殊意义a\.b匹配a.b不能匹配ajb^匹配行首awk中代表字符串开始^tux匹配以tux开头的行$匹配行尾awk中代表字符串结尾tux$匹配以tux结尾的行.匹配除换行符\n之外的任意单个字符ab.匹配abc、abd不能匹配abcd[]匹配[]内任意一个字符coo[kl]匹配cook、cool[^]匹配不在[]内的任意一个字符123[^45]匹配1236、1237不匹配1234、1235[-][]内匹配指定递增范围字符[0-9]匹配任意单个数字[a-z]匹配小写字母?匹配前面项0次或1次colou?r匹配color、colour不匹配colouur匹配前面项1次或多次sa-6匹配sa-6、sa-666不匹配sa-*匹配前面项0次或多次co*l匹配cl、col、cool、coool()分组创建匹配子串max(tri)?匹配max、maxtri{n}匹配前面项恰好n次[0-9]{3}匹配任意3位数字如123{n,}匹配前面项至少n次[0-9]{2,}匹配2位及以上数字12、1234{n,m}匹配前面项最少n次最多m次(n≤m)[0-9]{2,5}匹配2~5位数字12、12345|或交替匹配两边任意一项ab(c|d)匹配abc、abdPOSIX字符类字符描述示例[[:alpha:]]匹配任意一个字母等价于[A-Za-z][[:alpha:]]匹配连续字母如Hello[[:alnum:]]匹配任意一个字母或者数字等价于[A-Za-z0-9][[:alnum:]]*匹配abc123[[:digit:]]匹配任意一个数字等价于0-9[[:digit:]]{3}匹配3位数字如456[[:lower:]]匹配任意一个小写字母等价于a-z[[:lower:]]匹配linux[[:upper:]]匹配任意一个大写字母等价于A-Z[[:upper:]]{2}匹配XY[[:space:]]匹配任意一个空白符包括空格、制表符、换行符、分页符a[[:space:]]b匹配a b[[:blank:]]匹配空格和制表符[[:blank:]]匹配连续空格/Tab[[:graph:]]匹配任意一个看得见的可打印字符不包括空白字符[[:graph:]]匹配test!#[[:print:]]匹配任何一个可以打印的字符包含空白字符不含控制字符、\0、EOF[[:print:]]*匹配普通文本行[[:cntrl:]]匹配任何一个控制字符ASCII前32个字符换行、制表符等常用于过滤不可见控制符号[[:punct:]]匹配任何一个标点符号如[]{} , . !等[[:punct:]]匹配,、;、([[:xdigit:]]匹配十六进制数字即0-9、a-f、A-F[[:xdigit:]]{4}匹配0aE5位置锚定符号边界匹配字符描述示例^行首锚定匹配行最左侧^root匹配行开头为root的行$行尾锚定匹配行最右侧bash$匹配行结尾为bash的行^$匹配空行无任何字符grep ^$ file查找文件内空行^[[:space:]]*$匹配空白字符行空格/制表符grep ^[[:space:]]*$ file匹配只有空格的行\单词词首边界单词左侧\the匹配the、there不匹配other\单词词尾边界单词右侧the\匹配the、bathe不匹配there\...\匹配完整独立单词\the\只匹配单词the不匹配there/bathe\b通用单词边界符等价于 和 兼容多数正则\bthe\b匹配独立单词the扩展正则注意grep命令使用扩展正则需要加-E或者egrep直接使用扩展正则。支持使用扩展正则的工具grep -E、egrep、awk、sed -r限定符描述示例*匹配前面子表达式0次或者多次a*b匹配b、ab、aab、aaab.*任意长度的任意字符a.*b匹配ab、axb、a123b、a b?匹配前面子表达式0次或者1次即可有可无colou?r匹配color、colour不匹配colouur与星号相似表示其前面字符出现一次或多次但必须出现一次1sa-6匹配sa-6、sa-666不匹配sa-{n,m}匹配前面的子表达式n到m次[0-9]{2,5}匹配2~5位数字如12、12345{m}匹配前面的子表达式m次[0-9]{3}匹配恰好3位数字如123、456{n,}匹配前面的子表达式不少于n次n[0-9]{2,}匹配2位及以上数字如12、123456{,n}匹配前面的子表达式最多n次n[0-9]{,3}匹配最多3位数字如 、1、123|用逻辑OR或方式指定正则表达式要使用的模式cat|dog匹配cat或dog()字符串分组将括号中的字符串作为一个整体(ab)匹配ab、abab、ababab二、练习1、检测两台服务器指定目录下的文件一致性通过对比两台服务器上文件的md5值达到检测一致性的目的#!/bin/bashdir/data/webb_ip192.168.30.134#将指定目录下的文件全部遍历出来并作为md5sum命令的参数进而得到所有文件的md5值并写入到指定文件中find$dir-typef|xargsmd5sum/tmp/md5_a2/dev/nullssh$b_ipfind$dir-type f | xargs md5sum /tmp/md5_bscp$b_ip:/tmp/md5_b /tmp#将文件名作为遍历对象进行一一比对forfinawk{print $2} /tmp/md5_ado#以a机器为标准当b机器不存在遍历对象中的文件时直接输出不存在的结果ifgrep-qw$f/tmp/md5_bthenmd5_agrep-w$f/tmp/md5_a|awk{print $1}md5_bgrep-w$f/tmp/md5_b|awk{print $1}#当文件存在时如果md5值不一致则输出文件改变的结果if[$md5_a!$md5_b]thenecho$fchanged.fielseecho$fdeleted.fidone2、检测网卡流量并按规定格式记录在日志中规定一分钟记录一次日志格式如下所示:2019-08-12 20:40 ens33 input: 1234bps ens33 output: 1235bps代码while:do#设置语言为英文保障输出结果是英文否则会出现bugLANGenlogfile/tmp/date%d.log#将下面执行的命令结果输出重定向到logfile日志中exec$logfiledate%F %H:%M# 使用 sar 统计1分钟内的平均流量# -n DEV: 网络设备统计# 1 59: 每秒采样一次共59次约1分钟# grep -E: 匹配指定网卡的平均值行#sar命令统计的流量单位为kb/s日志格式为bps因此要*1000*8sar-nDEV159|grepAverage|grepens33|awk{print $2,\t,input:,\t,$5*1000*8,bps,\n,$2,\t,output:,\t,$6*1000*8,bps}echo####################done3、创建10个用户并分别设置密码密码要求10位且包含大小写字母以及数字最后需要把每个用户的密码存在指定文件中。#seq -w--equal-width等宽填充补前导零让输出数字拥有相同长度不足位数左边补 0foruinseq-w009do#创建用户useradduser_$u#生成密码#pmkpasswd -s 0 -l 10 #注意Ubuntu中有效RHEL中无效#openssl rand -base64 12 生成12字节二进制随机数据并编码为base64#tr -d删除字符 -c取反匹配 作用保留大小写字母、数字去除特殊字符#cut -c 1-10按字符截取取第 110 个字符popenssl rand-base6412|tr-dca-zA-Z0-9|cut-c1-10#从标准输入中读取密码进行修改不安全echo$p|passwd--stdinuser_$u#常规修改密码echo-e$p\n$p|passwduser_$u#将创建的用户及对应的密码记录到日志文件中echouser_$u$p/tmp/userpassword.logdone