linux三件客之awk全解

01.awk

awk:编程语言  GNU/awk
作用:1.取行
     2.取列
     3.模糊过滤
     4.数据统计,数据运算
     5.支持for循环 if判断 数组……
     6.格式化输出  sed后向引用
语法结构:awk '模式' file  # 模式是找谁 指定行 指定列 模糊查找  不加任何动作
        awk '模式(print)' file #模式+动作
        其他命令输出|  awk ‘模式’    
案例1awk按行查找
语法结构
awk 'NR==3' file #awk输出指定的行
awk内置变量
NR存放着文件中每行的行号
== 等于
>  大于第几行
<  小于第几行
>= 大于等于几行
<= 小于等于几行
!= 不等于
&& 并且
|| 或者
​
​
创造实验环境
[root@haha1 ~]# cat a.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
​
​
只显示文件的第三行
[root@haha1 ~]# awk 'NR==3' a.txt 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
​
为什么要加两个等号?
一个等号在系统中称为定义变量
​
只显示文件中小于3的行
[root@haha1 ~]# awk 'NR<3' a.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
只显示文件中大于3的行
[root@haha1 ~]# awk 'NR>3' a.txt 
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
不取第三行
[root@haha1 ~]# awk 'NR!=3' a.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
​
​
并且和或者
&& :并且
查找大于第二行  并且小于5的行
[root@haha1 ~]# awk 'NR>2&&NR<5' a.txt 
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
​
||:或者
案例:查找小于第2行,或者大于第5行
[root@haha1 ~]# awk 'NR<2||NR>5' a.txt 
1 root:x:0:0:root:/root:/bin/bash
​
​

案例2.模糊过滤文件内容

语法结构
    grep '' 文件
    sed -n '/内容/p' 文件
    awk '//,//' 文件
    awk '/内容/' 文件       
案例1.查找有root的行   
[root@haha1 ~]# awk '/root/' a.txt 
1 root:x:0:0:root:/root:/bin/bash
​
案例2.查找以1开头的行
[root@haha1 ~]# awk '/^1/' a.txt 
1 root:x:0:0:root:/root:/bin/bash
​
案例3.查找以n结尾的行
[root@haha1 ~]# awk '/n$/' a.txt 
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
​
案例4.查找有1,2,3的行
[root@haha1 ~]# awk '/[1-3]/' a.txt 
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
 
案例5.区间范围 工作中取时间范围较多
[root@haha1 ~]# awk '/^2/,/4/' a.txt 
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
​
 注意:三剑客支持扩展正则的写法
 grep -e 或者 egrep
 sed -r
 awk    什么都不加
 
 
 
 
 
 
 
 
 
 
 
 

案例3.awk取列

语法: awk '{print $n}' file
$0  awk的内置变量里面存放着每一行的内容
$1  表示第一列 默认以空格和tab键为分隔符 如果文件中没有空格和tab
$2  表示第二列
, 逗号 内置变量,表示空格
NF表示最后一列的列号
$NF 表示最后一列的内容

注意: 所有的字符串在awk中被识别为变量,所以输出字符串必须加双引号

案例1.显示文件的第一列
创造实验环境
[root@haha1 ~]# cat a.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

显示文件的第一列
[root@haha1 ~]# awk '{print $1}' a.txt 
1
2
3
4
5

显示文件的第二列
[root@haha1 ~]# awk '{print $2}' a.txt 
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
案例2.显示文件的第一列和第三列
[root@haha1 ~]# vim 3.txt

~                                                       
~                                                       
~                                                       
~                                                       
~                                                       
~                                                       
~                                                       
~                                                       
"3.txt" [New] 14L, 219C written
[root@haha1 ~]# awk '{print $1,$3}' 3.txt 

[root@haha1 ~]# awk '{print $1"\t"$3}' 3.txt 

案例。 先输出第3列,再输出第一列
[root@haha1 ~]# awk '{print $3"\t"$1}' 3.txt 


取出最后一列的内容
[root@haha1 ~]# awk '{print NF}' 3.txt  #显示最后一列的行号
3
3
3
3
3
3
3
3
3
3
3
2
3
3
[root@haha1 ~]# awk '{print $NF}' 3.txt #显示最后一行的内容
100
106
110
102
88
86
110
102
106
86
100
90
88
100

案例。取出磁盘中的第五列
[root@haha1 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.5M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda3        18G  2.0G   16G  12% /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs           199M     0  199M   0% /run/user/0
[root@haha1 ~]# df -h|awk  '{print $5}'
Use%
0%
0%
1%
0%
12%
56%
0%
案例。取出sda3的行的方法
[root@haha1 ~]# df -h|awk  '/sda3/'
/dev/sda3        18G  2.0G   16G  12% /
[root@haha1 ~]# df -h|grep  "/$"
/dev/sda3        18G  2.0G   16G  12% /
[root@haha1 ~]# df -h|grep  'sda3'
/dev/sda3        18G  2.0G   16G  12% /
[root@haha1 ~]# df -h|sed -n  '6p'
/dev/sda3        18G  2.0G   16G  12% /
[root@haha1 ~]# df -h|sed -n  '/sda3/p'
/dev/sda3        18G  2.0G   16G  12% /
[root@haha1 ~]# df -h|awk 'NR==6'
/dev/sda3        18G  2.0G   16G  12% /
案例。取出倒数第二列
[root@haha1 ~]# df -h|awk '{print NF-1}'
6
5
5
5
5
5
5
5
[root@haha1 ~]# df -h|awk '{print $(NF-1)}'
Mounted
0%
0%
1%
0%
12%
56%
0%
取出每行倒数第二列的内容
[root@haha1 ~]# awk '{print $(NF-1)}' 3.txt 
83
98
99
94
79
85
95
80
80
78
83
刘孟涛
75
最后一行为1-1=0 取$0  则输出最后一行全部内容 ($0表示全部)
[root@haha1 ~]# awk '{print $(NF-1)}' 3.txt 
83
98
99
94
79
85
95
80
80
78
83
刘孟涛
75
89
wewqe

awk指定分隔符:默认以tab键或空格分隔
-F
awk -F:    #方法1
awk -F":"  #方法2

案例。取出第一列
[root@haha1 ~]# awk -F: '{print $1}' a.txt 
1 root
2 bin
3 daemon
4 adm
5 lp

取出最后一列
[root@haha1 ~]# awk -F: '{print $NF}' a.txt 
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin



案例。指定多分隔符
[root@haha1 ~]# cat a.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@haha1 ~]# awk -F":/" '{print $2}' a.txt 
root
bin
sbin
var/adm
var/spool/lpd   

案例。取出两个root     +连续出现1次及1次以上的作为1个整体

[root@haha1 ~]# cat a.txt |head -1 >4.txt
[root@haha1 ~]# cat 4.txt 
1 root:x:0:0:root:/root:/bin/bash
[root@haha1 ~]# awk -F "[:/]+" '{print $5,$6}' 4.txt
root root


理解正则表达式+
[root@haha1 ~]# echo ---test-+haha1++::|awk -F "-" '{print $4}' #test在第四列
test
[root@haha1 ~]#  echo ---test-+haha1++::|awk -F "[-]+" '{print $2}' #前面三个---为一个整体
test
[root@haha1 ~]# echo ---test-+haha1++::|awk -F "[-+]" '{print $5}'

[root@haha1 ~]# echo ---test-+haha1++::|awk -F "[-+]" '{print $4}'
test
[root@haha1 ~]# echo ---test-+haha1++::|awk -F "[-+]" '{print $6}'
haha1
[root@haha1 ~]# echo ---test-+haha1++::|awk -F "[-+]+" '{print $3}'
haha1





案例4.awk模式+动作

创建实验环境
[root@haha1 ~]# cat a.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
​
[root@haha1 ~]# awk -F: 'NR==3{print $3 }' a.txt
2
​
​
案例2.取出用户名和最后一列
[root@haha1 ~]# awk -F "[ :]" '{print $2"\t" $NF  }' a.txt 
root    /bin/bash
bin /sbin/nologin
daemon  /sbin/nologin
adm /sbin/nologin
lp  /sbin/nologin
​
案例。取出/磁盘使用行的 第四列
指定行+动作
[root@haha1 ~]# df -h|awk 'NR==6'
/dev/sda3        18G  2.0G   16G  12% /
​
[root@haha1 ~]#  df -h|sed -n '/sda3/p'|awk '{print $4}' #第四列
16G
​
案例。取出dev相关的行的第一列和最后一列
[root@db01 ~]# df -h|awk '/sda3/,/sr0/'
/dev/sda3 18G 2.0G 16G 12% /
/dev/sda1 197M 110M 88M 56% /boot
/dev/sr0 4.4G 4.4G 0 100% /mnt
[root@db01 ~]# df -h|awk 'NR>5&&NR<9'
/dev/sda3 18G 2.0G 16G 12% /
/dev/sda1 197M 110M 88M 56% /boot
/dev/sr0 4.4G 4.4G 0 100% /mnt
[root@db01 ~]# df -h|awk '/sda3/,/sr0/{print $1,$NF}'
/dev/sda3 /
/dev/sda1 /boot
/dev/sr0 /mnt
[root@db01 ~]# df -h|awk 'NR>5&&NR<9{print $1,$NF}'
/dev/sda3 /
/dev/sda1 /boot
/dev/sr0 /mnt
​
扩展正则:字符串比对
[root@haha1 ~]# awk -F: '$NF=="/bin/bash"' a.txt 
1 root:x:0:0:root:/root:/bin/bash
​
查找以1开头的行
[root@haha1 ~]# awk -F: '/^1/' a.txt 
1 root:x:0:0:root:/root:/bin/bash
​
查找第二列以o开头的
[root@haha1 ~]# awk '$2 ~ /^o/' 3.txt 
许旺  haha1   100
杨明硕 haha1   88
查找第三列以1开头的
[root@haha1 ~]# awk '$3 ~ /^1/' 3.txt 
​
​
​
数字比较
[root@haha1 ~]# awk -F: '$3>0' a.txt 
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@haha1 ~]# cat a.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@haha1 ~]# awk -F: '$3<2 ' a.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
[root@haha1 ~]# awk -F: '$3<=2 ' a.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
​
成绩单统计
第三列(第二次成绩大于90的)
[root@haha1 ~]# awk '$3>90 ' 3.txt 
​
[root@haha1 ~]# awk '$3>90 ' 3.txt |wc -l    #统计人数
9
​
​
​
​
​
​

总结

1.awk取行
awk 'NR==3' file
NR==
NR!=
NR>=
NR<=
NR>
NR<
&&
||
2.awk模糊过滤
awk '/过滤的内容/' file
awk '//,//' file
支持正则
3.awk取列
awk '{print $1}' file
awk '{print $NF}' file 最后一列
4.awk指定分隔符
awk -F:
awk -F ":"
awk -F "[:/]+"
5.awk模式+动作
awk 'NR==6{print $3}'
awk '//{print $3}'
6.字符串比较
awk '$3=="root"' file
awk '$3!="root"' file 不等于
7.awk数值比较
awk '$3==0' file
awk '$3>90' file
awk '$3>80&&$3<90' file
|| 或者
​
  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值