linux之awk
awk命令
- 取行
- 取列
- 模糊匹配
- 判断比较
- 字符串比对
- 数字比对
- 支持
- 格式化输出
1.语法结构
sed -n '3p' file
awk 'NR==3' file
NR awk的内置变量 存储着每行的行号
符号
== 等于第几行
> 大于第几行
>= 大于等于第几行
< 小于第几行
<= 小于等于第几行
!= 不等
&& 并且 类似sed的 1,3
|| 或者
awk默认就是输出的动作 如果只输出则不需要加print
[root@m01 ~]# awk 'NR==2' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@m01 ~]# awk 'NR==2{print}' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
# awk取出文件大于7的行
# NR>7 NR<7 NR==7 NR!=7
[root@m01 ~]# awk 'NR>7' passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
2.模糊过滤
语法结构: 支持正则
sed -n '//p' file
awk '//' file # 模糊查找文件中的字符串
awk '//,//' file # 区间范围
# 过滤包含root的行
[root@m01 ~]# awk '/root/' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
# 找出以a开头的行
[root@m01 ~]# awk '/^a/' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
# 找出文件中包含root或者adm的行
[root@m01 ~]# awk '/root|adm/' passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
# 查找出以s或者b开头的行
[root@m01 ~]# awk '/^[sb]/' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
# 按照区间过滤 过滤日志中的时间范围
[root@m01 ~]# awk '/adm/,/ftp/' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
# 查找以h结尾的行号
[root@m01 ~]# awk '/h$/' passwd
root:x:0:0:root:/root:/bin/bash
usera:x:1000:1000::/home/usera:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash
user3:x:1003:1003::/home/user3:/bin/bash
userb:x:1004:1004::/home/userb:/bin/bash
userc:x:1005:1005::/home/userc:/bin/bash
3.awk取列
语法结构:
awk '{print $1}' file # 取出文件中的第1列
默认按照空格或者tab键分隔成列
如果没有空格或者tab键,awk会将整行看成一列
在awk中一切在动作中的字符串都被看做是变量,加上双引号则视为普通的字符串
awk内置变量
$0 # 表示整行
$1 # 表示文件的第1列
$2 # 表示文件的第2列
, # 逗号表示空格
NF # 表示每一行最后一列的列号
# 取出文件中的第一列
[root@m01 ~]# awk -F ":" '{print $1}' passwd
root
bin
daemon
adm
lp
# 取出文件的第1列和第3列
[root@m01 ~]# awk -F ":" '{print $1,$3}' passwd |column -t
root 0
bin 1
daemon 2
adm 3
lp 4
4.awk数值运算
# 取出文件中倒数第一列,和第二列
[root@m01 ~]# awk -F ":" '{print $NF,$(NF-1)}' passwd
/bin/bash /root
/sbin/nologin /bin
/sbin/nologin /sbin
/sbin/nologin /var/adm
5.awk指定分隔符
语法结构:
awk -F: '{print $1}' # 第一种指定分隔符方法
awk -F ":" '{print $1}' # 第二种指定分隔符方法
awk -F "[:/]"
awk -F ":|/"
6.awk模式+动作
模式: 通过NR找出指定的行 awk 'NR==5'
通过模糊过滤的方式找出行 awk '/root/'
awk 'NR==5{print $1}'
# 输出文件中第2行的第2列
[root@m01 ~]# awk -F ":" 'NR==2{print $2}' passwd
x
# 输出文件中的大于第2行的最后一列内容
[root@m01 ~]# awk -F ":" 'NR>2{print $2}' passwd
x
x
x
x
# 输出包含adm的行的 第3列
[root@m01 ~]# awk -F ":" '/adm/{print $3}' passwd
3
7.awk比较表达式
- 按照字符比对查找行
# 查找文件中第1列等于root的行
[root@m01 ~]# awk -F ":" '$1=="root"' passwd
root:x:0:0:root:/root:/bin/bash
# 使用正则匹配字符串 提取第1列包含a的行
[root@m01 ~]# awk -F ":" '$1 ~ "a"' passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
usera:x:1000:1000::/home/usera:/bin/bash
# 匹配最后一列以n结尾的行
[root@m01 ~]# awk -F ":" '$NF ~ "h$"' passwd
root:x:0:0:root:/root:/bin/bash
usera:x:1000:1000::/home/usera:/bin/bash
# 对root的行进行取反 第1列不包含root的行
[root@m01 ~]# awk -F ":" '$1 != "root"' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
# 提取第1列不是以r开头的行
[root@m01 ~]# awk -F ":" '$1 !~ "^r"' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
8.awk数字比对
# 第3列等于0的行
[root@m01 ~]# awk -F ":" '$3==0' passwd
root:x:0:0:root:/root:/bin/bash
# 第3列小于5的行
[root@m01 ~]# awk -F ":" '$3<5' passwd
root:x:0:0:root:/root:/bin/bash
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列 大于5小于10的行
[root@m01 ~]# awk -F ":" '$3>5&&$3<10' passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
# 提取第3列的第二行 在开始加上uid 结束加上 over
[root@m01 ~]# awk -F ":" 'BEGIN{print "==uid=="}NR==2{print $3}END{print "==over=="}' passwd
==uid==
1
==over==
9.总结
1.awk取行 *****
awk 'NR==3' file
df -h|awk 'NR==5'
NR==3
NR!=3
NR>3
NR>=3
NR<3
NR<=3
&&
awk 'NR>3&&NR<6' file
||
awk 'NR==5||NR>8' file
2.awk模糊过滤 *****
awk '//' file
awk '//,//' file # 区间范围
awk '/^/' file # 支持正则 ^ $ | []
3.awk取列 *****
默认空格tab键为分隔符
$1 $2
awk '{print $1}' file
awk '{print $1,$2}' file
awk '{print $NF}' file # 取出文件中最后一列
awk '{print $(NF-1)}' file # 取出文件中倒数第2列
4.awk指定分隔符 *****
awk -F
awk -F:
awk -F ":" '{print $1}' file
awk -F "[:/]" 指定任意单个
awk -F "[:/]+" 前字符出现连续1一次及以上作为1个字符串
awk -Fa # 指定a为分隔符
5.awk模式+动作 *****
awk 'NR==3{print $1}' # 第3行的第1列
awk 'NR>3&&NR<6{print $NF}' # 取出文件中大于3小于6行的最后一列
awk '/root/{print $1,$NF}' # 将包含root行的第1列和最后一列
awk '$3>3{print $3}' # 大于3的行的第3列
6.awk数值比对 字符串比对 *****
awk '$3==0'
awk '$3>0'
awk '$3>80'
awk '$3<60' #统计不及格的
awk -F: '$1=="root"'
awk -F: '$1 ~ /^r/'
awk -F: '$NF ~ /n$/'
Never try,never know