目录
- 扩展正则表达式
- egrep
- awk工具介绍
-
- 格式
- 解析
- awk工作原理
- 内建变量
- 用法
- 内建变量用法示例
-
- 输出第3行的第1第7个字段
- 输出第3行到第6行的第1第7个字段,输出第3行,第6行的第1第7个字段,输出大于等于第3行小于等于第6行的第1第7个字段
- 输出奇数行,偶数行的行号
- 统计以/bin/bash为结尾的行数
- 输出文件中每行中(以空格或制表符分隔)的第三个字段
- 输出文件中每行中(以空格或制表符分隔)的第一和三个字段
- 输出没有设置密码的用户
- 输出第7字段包含/bash,/bin/bash的用户
- 输出在/etc/services中第一个字段是nfs的且字段数是4个
- 输出第7字段不是/bin/bash也不是/sbin/nologin的内容
- 调用wc -l命令并用来统计1以/bash为结尾的行数即用户数
- 调用w命令统计在线的用户数
- 调用hostname并输出当前的主机名
- 输出path变量中的值,第三个字段的值
扩展正则表达式
扩展正则表达式元字符
- 扩展正则表达式是对基础正则表达式的扩充深化
扩展元字符
- +:匹配前面子表达式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