awk
- awk:单行脚本
- 核心 awk:取行
- 核心 awk:取列
- 核心 awk:混合取行取列
- awk:统计功能
- 未来:判断循环
- 未来:数组
1、awk概述
四剑客 | 特点 | 擅长 |
---|---|---|
find | 查找文件 | 查找文件,与其他命令配合 |
grep/egrep | 过滤 | 过滤速度最快 |
sed | 过滤、取行、替换、删除 | 替换修改文件内容、取行 |
awk | 过滤、取行、取列、统计计算、判断、循环... | 取行、取列、统计计算 |
- awk是一种语言,叫做单行脚本
1、格式
取出/etc/passwd中的第1行的第1列、第3列和最后一列
awk -F: NR==1{print $1,$3,$NF} ' /etc/passwd
awk -F: '条件{动作1;动作2...}' /etc/passwd
条件:找谁
动作:干啥
2、awk取行
1️⃣取出/etc/passwd中的第一行
NR:Number of Record 记录号、行号。也可以写大于几行,小于几行
{print $0}:输出整行内容,$0表示当前的内容
## 简写
[root@Ansible-server ~]# awk 'NR==1' /etc/passwd
root:x:0:0:root:/root:/bin/bash
## 完整写法
[root@Ansible-server ~]# awk 'NR==1{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@Ansible-server ~]# awk 'NR>=6{print $0}' /etc/passwd
2️⃣取/etc/passwd出2-5行的内容
&&:表示并且,and
||:表示或者,or
[root@Ansible-server ~]# awk 'NR>=2 && NR<=5{print $0}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
3️⃣过滤出/etc/passwd文件中包含root或者nobody的行
[root@Ansible-server ~]# awk '/root|nobody/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
stap-server:x:155:155:Systemtap Compile Server:/opt/rh/gcc-toolset-11/root/var/lib/stap-server:/sbin/nologin
4️⃣从包含root的行开始输出到包含nobody的行,可以使用这个功能实现截取一个时间段的日志
[root@Ansible-server ~]# awk '/root/ , /nobody/' /etc/passwd
-
小结
-
awk+NR:取出指定的行,指定范围的行
-
awk+//:过滤
-
awk+其他变量:用于精确过滤(讲完取列就可以使用)
[root@Ansible-server ~]# awk -F: '$3==0' /etc/passwd root:x:0:0:root:/root:/bin/bash
-
3、awk取列
1️⃣使用awk取出
ls -lh
的表示大小的列和最后一列
- NF:表示有多少列
- $NF:最后一列
[root@Ansible-server opt]# ls -lh | awk '{print $5,$9}'
[root@Ansible-server opt]# ls -lh | awk '{print $5,$NF}'
49 a.txt
4.0K mplayer
2.1K passwd
93 rh
12G rhel8.8.iso
74 sed.txt
[root@Ansible-server opt]# ls -lh | awk 'NR>1{print $5,$NF}' | column -t
49 a.txt
4.0K mplayer
2.1K passwd
93 rh
12G rhel8.8.iso
74 sed.txt
[root@Ansible-server opt]# echo 123 355 6667 87678 23 | awk '{print $(NF-1),$NF}'
87678 23
2️⃣取出/etc/passwd中第一列、第三列和第五列
-F:指定列之间的分隔符,如果不加-F则默认是空格,-F也支持正则指定分隔符
[root@Ansible-server opt]# awk -F: '{print $1,$3,$NF}' /etc/passwd | column -t
3️⃣指定复杂分隔符取出IP
⚠️在inet前有多个空格,对于awk,如果使用-F参数,每遇到一个空格就切一刀,因此为了实现把所有连续的空格作为一个整体一起切断,我们需要在正则匹配分隔符时加上+号。
[root@Ansible-server opt]# ip address show ens160 | awk 'NR==4' | awk '{print $2}' | awk -F'/' '{print $1}'
192.168.121.141
## 进行简化
[root@Ansible-server opt]# ip address show ens160 | awk 'NR==4' | awk -F'[ /]+' '{print $3}'
192.168.121.141
[root@Ansible-server opt]# ip address show ens160 | awk 'NR==4' | awk -F'inet |/24' '{print $2}'
192.168.121.141
- 小结
- 如果是空格、连续空格,直接使用awk取列即可
- 其他情况使用-F指定分隔符,必要时加正则实现
4、awk取行取列
awk 格式 '条件{动作}'
标签:passwd,server,etc,awk,print,root From: https://www.cnblogs.com/xuruizhao/p/18305890