shell-----正则表达式之awk

一.awk工具的概述

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

二.awk的常见用法

  • awk的命令格式如下
  • awk 选项 ‘模式或条件 {编辑指令}’  文件1 文件2...     //过滤并且输出文件符合条件的内容
  • awk -f 脚本文件  文件1  文件2 ...  //从脚本中调用编辑指令,过滤并且输出内容
  • awk工具按列读取数据,默认情况下字段的分隔符为空格或者tab键
  • awk执行的结果可以通过print的功能将字段数据打印显示,且用$1,$2,$3...顺序地表示行中的不同字段,此外$0表示整个行的记录
  • 不同的字段之间是通过指定的字符分隔,awk默认的分隔符是空格,awk允许在命令行中用“-F 分隔符”的形式来指定分隔符。
  • awk包含几个特殊的内建变量(可直接用)如下所示
  • FS:指定每行文本的字段分隔符,默认为空格或制表符(tab键)
  • NF:当前处理的行的字段个数
  • NR:当前处理的行的行号(序数)
  • $0:当前处理的行的整行内容
  • $n:当前处理行的第n个字段(第n列)
  • FILENAME:被处理的文件名
  • RS:数据记录分隔,默认为\n,即每行为一条记录

三.awkd的用法示例

  • 按行输出文件
输出整个文本
[root@localhost ~]# awk '{print}' while.txt 
this is a girl
the house
echo "hello world"
[root@localhost ~]# awk '{print $0}' while.txt 
this is a girl
the house
echo "hello world"
[root@localhost ~]#

输出特定行的内容,NR表示行号
[root@localhost ~]# awk 'NR==5{print}' while.txt 
¥ * …… @ !?
[root@localhost ~]# 
[root@localhost ~]# awk 'NR==2,NR==5{print}' while.txt 
the house
echo "hello world"
1 2 3 4 5 6
¥ * …… @ !?
[root@localhost ~]# awk '(NR>=1)&&(NR<=2){print}' while.txt 
this is a girl
the house
[root@localhost ~]# awk 'NR==1||NR==5{print}' while.txt 
this is a girl
¥ * …… @ !?

输出2到5行的奇数行(awk输出奇偶数是绝对的)
[root@localhost ~]# awk '(NR>=2)&&(NR<=5)&&(NR%2)==1{print}' while.txt 
3: echo "hello world"
5: ¥ * …… @ !?
[root@localhost ~]# 

输出所有的偶数行
[root@localhost ~]# awk '(NR%2)==0{print}' while.txt 
2: the house
4: 1 2 3 4 5 6
[root@localhost ~]# 

输出以数字结尾的行
[root@localhost ~]# awk '/[0-9]$/{print}' while.txt 
4: 1 2 3 4 5 6

输出包含the字符的行
[root@localhost ~]# awk '/the/{print}' while.txt 
2: the house
[root@localhost ~]# 



 
  • awk中BEGIN的用法
统计在/etc/passwd之中以/bin/bash结尾的行的个数
[root@localhost ~]# awk 'BEGIN {x=0} ; /\/bin\/bash$/ {x++} ; END {print x}' /etc/passwd
2

统计在/etc/passwd之中以zhangsan开头的行的个数
[root@localhost ~]# awk 'BEGIN {x=0} ; /^zhangsan/ {x++} ; END {print x}' /etc/passwd
1
[root@localhost ~]# 
  • 按字段输出文本
输出以冒号分隔的行中的第1,2个字段
[root@localhost ~]# awk 'BEGIN {FS=":"} ; {print $1,$2}' a.txt
root op
zhangsan iui mn 12 
lisi lkj
wangwu 78 XX @@@ df 
[root@localhost ~]# cat a.txt
root:op:ooo:0927
zhangsan iui mn 12
lisi:lkj:ppp:dnf:cf
wangwu 78 XX @@@ df
[root@localhost ~]# 



输出密码为空的用户
[root@localhost ~]# awk 'BEGIN {FS=":"} ; $2=="!!"{print $1}' /etc/shadow
systemd-network
dbus
polkitd
abrt
libstoragemgmt
rpc
colord
saslauth
rtkit
pulse
chrony
rpcuser
nfsnobody
ntp
tss
usbmuxd
geoclue
qemu
radvd
setroubleshoot
sssd
gdm
gnome-initial-setup
sshd
avahi
postfix
tcpdump
named
[root@localhost ~]# 

第一个字段包含字符nfs和存在8个字符的行中,输出其中的第一个字符和第二个字符
[root@localhost ~]# awk '($1~"nfs")&&(NF==8){print $1,$2}' /etc/services
nfs 2049/tcp
nfs 2049/udp
nfs 2049/sctp
netconfsoaphttp 832/tcp
netconfsoaphttp 832/udp
netconfsoapbeep 833/tcp
netconfsoapbeep 833/udp
[root@localhost ~]# 

输出第七个字段既不为/bin/bash,也不为/sbin/nologin
[root@localhost ~]# awk -F : '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost ~]# 


  • 通过管道、双引号调用shell命令
统计以/bin/bash结尾的用户
[root@localhost ~]# awk -F : '/bash$/ {print | "wc -l"}' /etc/passwd
2
[root@localhost ~]# 

统计在用户数
[root@localhost ~]# awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'
1
[root@localhost ~]# w
 16:56:01 up  4:43,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.43.1     12:18    1.00s  0.62s  0.00s w
[root@localhost ~]# 

输出当前主机名
[root@localhost ~]# awk -F . 'BEGIN {"hostname" | getline ; print $1}'
localhost
[root@localhost ~]# 

 

注:一些空格,有可能因为空格没有导致,命令出错

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值