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
posted @ 2024-11-14 17:07  Linux小菜鸟  阅读(23)  评论(0编辑  收藏  举报