正则表达式与awk工作原理

正则表达式与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,并输出当前的主机名

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44505291/article/details/111907438