正则表达式与awk工作原理
文章目录
一、正则表达式
通常用于判断语句中,用于检查某一字符串是否满足某一格式
正则表达式是由普通字符与元字符组成
普通字符包括大小写字母、数字、标点符号及一些其他符号
元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字
符(即位于元字符前面的字符)在目标对象中的出现模式
1、基础正则表达式常见元字符
\ :转义字符,用于取消特殊符号的含义,例: \!、\n、\$等
^ :匹配字符串开始的位置,例: ^a、 ^the、 ^#、^[a-z]
$ :匹配字符串结束的位置,例: word$、 ^$匹配空行
. :匹配除\n之外的任意的一个字符,例: go.d、 g..d
:匹配前面子表达式0次或者多次,例: goo*d、 go.*d
[list] :匹配list列表中的一个字符,例: go[ola]d, [abc]、 [a-z]、 [a-z0-9]、 [0-9]匹配任意一位数字
[^list] :匹配任意非list列表中的一个字符,例: [^0-9]、 [^A-20-9]、 [^a-z]匹配任意一位非小写字母
\{n\} :匹配前面的子表达式n次,例: go\{2\}d、 '[0-9]\{2\} '匹配两位数字
\{n,\} :匹配前而的子表达式不少于n次,例: go\{2, \}d、'[0-9]\{2, \}'匹配两位及两位以上数字
\{n,m\} :匹配前面的子表达式n到m次,例: go\{2,3\}d、 ' [0-9]\{2,3\}'匹配两位到三位数字
注: egrep、 awk使用{n}、{n,小、{n, m}匹配时“{}”前不
用加“\”
2、扩展正则表达式元字符
:匹配前面子表达式1次以上,例: go+d, 将匹配至少一个o, 如god、 good、 goood等
? :匹配前面子表达式0次或者1次,例: go?d, 将匹配gd或god
() :将括号中的字符串作为h一个整体,例1: g(oo)+d," 将匹配oo整体1次以上,如good、gooood等
| :以或的方式匹配字条串,例: g (oo|la)d," 将匹配good或者glad
二、awk
1、工作原理
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字
段保存到内建变量中,并按模式或者条件执行编辑命令。
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再
进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将
字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符“&&”表
示“与”、“||”表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、
*、/、%、^分别表示加、减、乘、除、取余和乘方。
2、命令格式
awk 选项 '模式或条件 {操作}' 文件 1 文件 2 …
awk -f 脚本文件 文件 1 文件 2 …
3、awk常见的内建变量
FS:列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
NF:当前处理的行的字段个数。
NR:当前处理的行的行号(序数)。
$0:当前处理的行的整行内容。
$n:当前处理行的第n个字段(第n列)。
FILENAME:被处理的文件名。
RS:行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n’
4、按行输出文本
awk '{print}' 1.txt #输出所有内容
awk '{print $0}' 1.txt #输出所有内容
awk 'NR==1,NR==3{print}' 1.txt #输出第 1~3 行内容
awk '(NR>=1)&&(NR<=3){print}' 1.txt #输出第 1~3 行内容
awk 'NR==1||NR==3{print}' testfile2 #输出第1行、第3行内容
awk '(NR%2)==1{print}' testfile2 #输出所有奇数行的内容
awk '(NR%2)==0{print}' testfile2 #输出所有偶数行的内容
awk '/^root/{print}' /etc/passwd #输出以 root 开头的行
awk '/nologin$/{print}' /etc/passwd #输出以 nologin 结尾的行
5、按字段输出文本
awk -F ":" '{print $3}' /etc/passwd
#输出每行中(以空格或制表位分隔)的第3个字段
awk -F ":" '{print $1,$3}' /etc/passwd
#输出每行中的第1、3个字段
awk -F ":" '$3<5{print $1,$3}' /etc/passwd
#输出第3个字段的值小于5的第1、3个字段内容
awk -F ":" '!($3<200){print}' /etc/passwd
#输出第3个字段的值不小于200的行
awk -F ":" '($1~"root")&&(NF==7){print $1,$2}' /etc/passwd
#输出第1个字段中包含root且有7个字段的行的第1、2个字段
awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd
#输出第7个字段既不为/bin/bash,也不为/sbin/nologin的所有行
6、通过管道、双引号调用 Shell 命令
echo $PATH | awk 'BEGIN{RS=":"};END{print NR}'
#统计以冒号分隔的文本段落数,END{}语句块中,往往会放入打印结果等语句
awk -F: '/bash$/{print | "wc -l"}' /etc/passwd
#调用 wc -l 命令统计使用 bash 的用户个数,等同于 grep -c “bash$” /etc/passwd
free -m | awk '/Mem:/ {print int($3/($3+$4)*100)}'
#查看当前内存使用百分比
date -d "$(awk -F "." '{print $1}' /proc/uptime) second ago" +"%F %H:%M:%S"
#显示上次系统重启时间,等同于uptime;second ago为显示多少秒前的时间,+"%F %H:%M:%S"等同于+"%Y-%m-%d %H:%M:%S"的时间格式
awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}"%"}'
#调用w命令,并用来统计在线用户数
awk 'BEGIN {"hostname" | getline ; {print $0}}'
#调用 hostname,并输出当前的主机名