awk命令
awk
【1】、awk作用
1.取行
2.取列
3.模糊过滤
4.判断比较
字符串比对
数字比对
5.支持if for while 数组
6.格式化输出
GNU/AWK
编程语言
语法结构:
awk '模式' file # 默认就是输出 不需要加动作
awk '模式+动作' file
其他命令的输出|作为awk命令的输入
df -h|awk 'NR==2'
【2】、awk取行
语法结构:
awk 'NR==3' file
NR awk的内置变量,存储着每行的行号
符号
== 等于第几行
> 大于第几行
>= 大于等于第几行
< 小于第几行
<= 小于等于第几行
!= 不等
&& 并且 类似sed的 1,3
|| 或者
案例1:awk取出文件的第三行
[root@kylin-xu ~]# awk 'NR==3' passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
案例2:awk取出文件行数大于77的行
[root@kylin-xu ~]# awk 'NR>7' passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
root:x:11:0:operator:/root:/sbin/nologin
案例3:awk取出文件中行数小于3 的行
[root@kylin-xu ~]# awk 'NR<3' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
案例4:awk取出文中行数不等于1的行
[root@kylin-xu ~]# awk 'NR!=1' passwd
案例5:查找大于3小于5的行
[root@kylin-xu ~]# awk 'NR>3&&NR<5' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
案例6:查找第3行或第5行
[root@kylin-xu ~]# awk 'NR==3||NR==5' passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
【3】、awk模糊过滤
语法结构: 支持正则
sed -n '//p' file
awk '//' file # 模糊查找文件中的字符串
awk '//,//' file # 区间范围
案例1:找出root的行
[root@kylin-xu ~]# awk '/root/' passwd
root:x:0:0:root:/root:/bin/bash
root:x:11:0:operator:/root:/sbin/nologin
案例2:找出包含bash的行
[root@kylin-xu ~]# awk '/bash/' passwd
root:x:0:0:root:/root:/bin/bash
案例3:找出以a开头的行
[root@kylin-xu ~]# awk '/^a/' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
案例4:找出文件中包含root或adm的行
[root@kylin-xu ~]# awk '/root|adm/' passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
root:x:11:0:operator:/root:/sbin/nologin
案例5:查找中包含b或s开头的行
[root@kylin-xu ~]# awk '/^[bs]/' 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
案例6:过滤adm开头的行,到halt开头的行
[root@kylin-xu ~]# awk '/^adm/,/^halt/' 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
[root@kylin-xu ~]# df -h | awk '/run$/,/\/$/'
tmpfs 979M 22M 957M 3% /run
tmpfs 979M 0 979M 0% /sys/fs/cgroup
/dev/mapper/klas-root 39G 3.7G 35G 10% /
【4】、awk取列
语法结构:
awk '{print $1}' file # 取出文件中的第1列
默认按照空格或者tab键分隔成列
如果没有空格或者tab键,awk会将整行看成一列
在awk中一切在动作中的字符串都被看做是变量,加上双引号则视为普通的字符串
awk内置变量
$0 # 表示整行
$1 # 表示文件的第1列
$2 # 表示文件的第2列
, # 逗号表示空格
NF # 表示每一行最后一列的列号
案例1:取出第一列
[root@kylin-xu ~]# awk '{print $1}' 4.txt
a
d
a
a
案例2:取出第一列和第二列,双引号视为普通字符串
[root@kylin-xu ~]# awk '{print $1,$2}' 4.txt
a b
d e
a s
a x
[root@kylin-xu ~]# awk '{print $1" "$2}' 4.txt
a b
d e
a s
a x
[root@kylin-xu ~]# awk '{print $1","$2}' 4.txt
a,b
d,e
a,s
a,x
案例3:取出第二列和第一列,反着来
[root@kylin-xu ~]# awk '{print $2","$1}' 4.txt
b,a
e,d
s,a
x,a
案例4:取出文件中最后一列,NF是表示每一行有多少列是具体的数字
[root@kylin-xu ~]# awk '{print NF}' 4.txt
3
3
4
5
[root@kylin-xu ~]# awk '{print $NF}' 4.txt
c
f
g
b
[root@kylin-xu ~]# df -h| awk '{print $NF}'
挂载点
/dev
/dev/shm
/run
/sys/fs/cgroup
/
/tmp
/backup
/boot
/run/user/0
指定分隔符
awk指定分隔符
语法结构:
awk -F: '{print $1}' # 第一种指定分隔符方法
awk -F ":" '{print $1}' # 第二种指定分隔符方法
案例1:取出passwd文件中第一列
awk -F: '{print $1}' passwd
案例2:统计成绩
[root@kylin-xu ~]# cat sorce.txt
张三 Linux96 100
李四 Linux96 22
老王 Linux96 33
赵六 Linux96 44
[root@kylin-xu ~]# awk '{print $1,$3}' sorce.txt | sort -rn -k2
张三 100
赵六 44
老王 33
李四 22
案例3:万物皆可分割
[root@kylin-xu ~]# echo abca | awk -Fc '{print $1}'
ab
[root@kylin-xu ~]# awk -F ":/" '{print $2}' passwd
root
bin
sbin
var/adm
var/spool/lpd
sbin
sbin
sbin
var/spool/mail
root
案例4:指定两个分隔符
[root@kylin-xu ~]# awk -F ":|/" '{print NF}' passwd
10
10
10
11
12
10
10
10
12
10
案例5:任意字符作为分隔符
[root@kylin-xu ~]# awk -F "[:/]" '{print NF}' passwd
案例6:
[root@kylin-xu ~]# cat 5.txt
--:-/test--/::oldboy-oldgirl
[root@kylin-xu ~]# awk -F "[-:/]" '{print $6}' 5.txt
test
[root@kylin-xu ~]# awk -F "[-:/]+" '{print $2}' 5.txt
test
awk模式+动作
模式: 通过NR找出指定的行 awk 'NR==5'
通过模糊过滤的方式找出行 awk '/root/'
awk 'NR==5{print $1}'
案例1:输出文件中第二行第二列
[root@kylin-xu ~]# awk -F: 'NR==2{print $2}' passwd
x
案例2:输出文件中大于第六行的最后一列
[root@kylin-xu ~]# awk -F: 'NR>6{print $NF}' passwd
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
案例3:输出第一行的第一列和最后一列
[root@kylin-xu ~]# awk -F: 'NR==1{print $1,$NF}' passwd
root /bin/bash
案例4:输出包含adm的行的第三列
[root@kylin-xu ~]# awk -F: '/^adm/{print $3}' passwd
3
面试题 我有一个文档,取出文件中的第5行的第3列
awk 'NR==5{print $3}'
比较表达式
按照字符比对查找行
案例1:查找第一列等于root的行
[root@kylin-xu ~]# awk -F: '$1=="root"' passwd
root:x:0:0:root:/root:/bin/bash
root:x:11:0:operator:/root:/sbin/nologin
案例2.使用正则匹配字符串,匹配第一列以n结尾的行
[root@kylin-xu ~]# awk -F: '$1 ~ "n$"' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
案例3:匹配最后一列以n结尾的行
awk -F: '$1!="root"' passwd
案例4:对开头是r的行进行取反
awk -F: '$1 ~ "^[^r]"' passwd
案例5:数字比对
[root@kylin-xu ~]# awk -F: '$3==0' passwd
root:x:0:0:root:/root:/bin/bash
案例6:第三列大于5的行
awk -F: '$3>=5' passwd
[root@kylin-xu ~]# awk '$3>=50' sorce.txt
张三 Linux96 100
【5】、awk算术运算
案例1:
[root@kylin-xu ~]# awk 'BEGIN {print 10+1}'
11
案例2:输出倒数第二列
[root@kylin-xu ~]# awk '{print NF-1}' 4.txt
2
2
3
4
[root@kylin-xu ~]# awk '{print $(NF-1)}' 4.txt
b
e
f
v
[root@kylin-xu ~]# awk '{print $(NF-1)}' 4.txt
a
e
f
v
本文来自博客园,作者:Linux小菜鸟,转载请注明原文链接:https://www.cnblogs.com/xuruizhao/p/18546401