Shell编程扩展正则表达式(egrep、awk)

扩展正则表达式

扩展正则表达式元字符

  • 扩展正则表达式是对基础正则表达式的扩充深化

扩展元字符

  • +:匹配前面子表达式1次以上 例如:go+d,将匹配至少一个o(如god,good,goood…)
  • ?:匹配前面子表达式0次或者1次 例如:go?d,将匹配gd或god
  • ():括号中的字符串作为一个整体 例如:(xyz)+,将匹配xyz整体1次以上,如xyzxyz
  • |:以或的方式匹配字条串 例如1:good|food,将匹配good或者food 例如2:g(oo|la)d,将匹配good或者glad
    (g|f)ood good或者food

egrep

示例

匹配o至少出现一次或者以上次数的内容

[root@server2 ~]# vi test.txt 
[root@server2 ~]# grep -n 'oo*' test.txt 

在这里插入图片描述

[root@server2 ~]# vi test.txt 
[root@server2 ~]# egrep -n 'o+' test.txt 

在这里插入图片描述

匹配以be为开头,t为结尾,中间可以是s或者为空的内容

[root@server2 ~]# egrep -n 'bes?t' test.txt 

在这里插入图片描述

匹配以sh为开头,rt为结尾,中间可以是i或者o的内容

[root@server2 ~]# grep -n sh[io]rt test.txt 
[root@server2 ~]# egrep -n 'sh(i|o)rt' test.txt 
[root@server2 ~]# egrep -n sh'(i|o)'rt test.txt 

在这里插入图片描述

匹配包含oo出现一次,或者一次以上的内容

[root@server2 ~]# egrep -n '(oo)+' test.txt 

在这里插入图片描述

awk工具介绍

格式

  • awk 选项 ‘模式或条件 {编辑指令}’ 文件1 文件2
  • awk -f 脚本文件 文件1 文件2

解析

awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于Shell脚本,完成各种自动化配置任务。

awk工作原理

逐行读取文本,默认以空格为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令

内建变量

  • FS:指定每行文本的字段分隔符,默认为空格或制表位。
  • NF:当前处理的行的字段个数。
  • NR:当前处理的行的行号(序数)。
  • $0: 当前处理的行的整行内容。
  • $n:当前处理的行的第n个字段(第n列)。
  • FILENAME:被处理的文件名
  • RS:数据记录分隔,默认为\n,即每行为一条记录

用法

查找出在/etc/passwd所有文件信息的第1个,第7个字段内容

[root@server2 ~]# awk -F: '{print $1,$7}' /etc/passwd

在这里插入图片描述

查找出在/etc/passwd所有文件信息的第1个,第7个字段内容且以zjq为开头的和以/sbin/nologin结尾的内容

[root@server2 ~]# awk -F: '/^zjq/{print $1,$7}' /etc/passwd
[root@server2 ~]# awk -F: '/\/sbin\/nologin$/{print $1,$7}' 

在这里插入图片描述

内建变量用法示例

输出第3行的第1第7个字段

[root@server2 ~]# awk -F: 'NR==3{print $1,$7}' /etc/passwd

在这里插入图片描述

输出第3行到第6行的第1第7个字段,输出第3行,第6行的第1第7个字段,输出大于等于第3行小于等于第6行的第1第7个字段

[root@server2 ~]# awk -F: 'NR==3,NR==6{print $1,$7}' /etc/passwd
[root@server2 ~]# awk -F: '(NR==3)||(NR==6){print $1,$7}' /etc/passwd
[root@server2 ~]# awk -F: '(NR>=3)&&(NR<=6){print $1,$7}' /etc/passwd

在这里插入图片描述

输出奇数行,偶数行的行号

[root@server2 ~]# cat /etc/passwd | wc -l 
[root@server2 ~]# awk -F: '(NR%2)==1{print $1,$7}' /etc/passwd | wc -l
[root@server2 ~]# awk -F: '(NR%2)==0{print $1,$7}' /etc/passwd | wc -l

在这里插入图片描述

统计以/bin/bash为结尾的行数

[root@server2 ~]# awk  'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd

在这里插入图片描述

输出文件中每行中(以空格或制表符分隔)的第三个字段

[root@server2 ~]# awk '{print $3}' test.txt 

在这里插入图片描述

输出文件中每行中(以空格或制表符分隔)的第一和三个字段

[root@server2 ~]# awk '{print $1,$3}' test.txt 

在这里插入图片描述

输出没有设置密码的用户

[root@server2 ~]# awk -F: '$2=="!!"{print}' /etc/shadow 
[root@server2 ~]# awk  'BEGIN {FS=":"};$2=="!!"{print}' /etc/shadow 

在这里插入图片描述
在这里插入图片描述

输出第7字段包含/bash,/bin/bash的用户

[root@server2 ~]# awk -F: '$7~"/bash"{print $1}' /etc/passwd
[root@server2 ~]# awk -F: '$7~"/bin/bash"{print $1}' /etc/passwd

在这里插入图片描述

输出在/etc/services中第一个字段是nfs的且字段数是4个

[root@server2 ~]# grep "nfs" /etc/services
[root@server2 ~]# awk '($1~"nfs")&&(NF==4){print $1}' /etc/services

在这里插入图片描述

输出第7字段不是/bin/bash也不是/sbin/nologin的内容

[root@server2 ~]# awk -F: '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd

在这里插入图片描述

调用wc -l命令并用来统计1以/bash为结尾的行数即用户数

[root@server2 ~]# awk -F: '/bash$/{print}' /etc/passwd | wc -l
[root@server2 ~]# awk -F: '/bash$/{print | "wc -l"}' /etc/passwd 
[root@server2 ~]# grep -c "bash$" /etc/passwd

在这里插入图片描述

调用w命令统计在线的用户数

[root@server2 ~]# awk 'BEGIN {while ("w" | getline) n++; {print n-2}}'

在这里插入图片描述

调用hostname并输出当前的主机名

[root@server2 ~]# awk 'BEGIN {"hostname" | getline;print $0}' 

在这里插入图片描述

输出path变量中的值,第三个字段的值

[root@server2 ~]# echo $PATH
[root@server2 ~]# echo "$PATH" > a.txt
[root@server2 ~]# cat a.txt 
[root@server2 ~]# awk -F: '{print}' a.txt
[root@server2 ~]# awk -F: '{print$3}' a.txt

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_49343462/article/details/109668584