linux三剑客 awk

1. awk

awk: 编程语言 GNU/awk
作用:
1.取行
2.取列
3.模糊过滤
4.数据统计 数据运算
5.支持for循环 if判断 数组..
6.格式化输出 sed后向引用

awk 语法结构

awk '子命令'         ‘文件’               # 不加任何动作,默认为输出的动作
awk '子命令{print}'         ‘文件’      # 模式+动作
其他的命令输出 | awk  '模式'

2. awk按照行查找

语法结构:
        sed -n '3p' file             # sed 输出指定的行


        awk 'NR==3' file         # awk输出指定的行


awk的内置变量:
        NR存放着文件中每行的行号

NR的表达式:
        == 等于第几行
        > 大于第几行
        < 小于第几行
        >= 等于等于第几行
        <= 小于等于第几行
        != 不等于
        && 并且
        || 或者

2.1.1 配置环境

[root@linux ~]# mkdir sjklx
[root@linux ~]# cd sjklx/
[root@linux sjklx]# touch test.txt
[root@linux sjklx]# head -5 /etc/passwd > test.txt

2.1.2 显示第三行

[root@linux sjklx]# awk 'NR==3' test.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin

#在编程语言中,一个等号的意思是定义和赋值,而两个等号才是判断等于

2.1.3 显示小于3的行

[root@linux sjklx]# awk 'NR<3' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

2.1.4 显示大于3的行

[root@linux sjklx]# awk 'NR>3' test.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

2.1.4 显示小于等于3的行

[root@linux sjklx]# awk 'NR<=3' test.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

2.1.5 显示不等于3的行

[root@linux sjklx]# awk 'NR!=3' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

2.2 并 和 或的应用

2.2.1 显示大于2 并且小于5的行

[root@linux sjklx]# awk 'NR>2&&NR<5' test.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

2.2.2 显示小于2 或者大于4的行 

[root@linux sjklx]# awk 'NR<2||NR>4' test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

2.3 模糊过滤文件内容

语法结构

grep '子命令'         ‘文件’
sed -n '/内容/p'      ‘文件’
awk    '/内容/'         ‘文件’
awk      '//,//'           ‘文件’

2.3.1 查找包含root的行

[root@linux sjklx]# awk '/root/' test.txt
     1  root:x:0:0:root:/root:/bin/bash

2.3.2 查找r开头的行

[root@linux sjklx]# awk '/^r/' test.txt
root:x:0:0:root:/root:/bin/bash

2.3.3 查找h结尾的行

[root@linux sjklx]#  awk '/h$/' test.txt
root:x:0:0:root:/root:/bin/bash

2.3.4 查找 a-d 开头的行

[root@linux sjklx]# awk '/^[a-d]/' test.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

2.3.5 使用区间范围查找 r 开头到 d 的行

[root@linux sjklx]#  awk '/^r/,/d/' test.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

ps: 三剑客的扩展正则

grep -E 或者egrep
sed -r
awk 默认支持扩展正则

2.4 awk 取列

语法结构

    awk '{print $n}' file
$0 awk的内置变量里面存放着每行的内容
$1 表示第1列 默认以空格和tab键为分隔符,如果文件中没有空格和tab键则文件内容被当做

     第一列
$2 表示第2列
,  逗号 内置变量,表示空格
NF 表示最后一列的列号
$NF 表示最后一列的内容


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

2.4.1 为文件添加行号

[root@linux sjklx]# awk '{print NR " " $0}'  test.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
行号

行号与行之间的空格

当前行的内容

由于重定向会优先执行所以直接重定向修改原文件会导致结果为空

所以可以通过mv进行临时文件的替换

[root@linux sjklx]# awk '{print NR " " $0}' test.txt > temp.txt && mv temp.txt test.txt
mv:是否覆盖"test.txt"? y
[root@linux sjklx]# cat test.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

2.4.2 去除特殊符号来转换列

[root@linux sjklx]# sed -i 's#[:/]# #g' test.txt
[root@linux sjklx]# cat test.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、

2.4.3 显示第一 第三列

[root@linux sjklx]# awk '{print $1,$3}' test.txt
1 x
2 x
3 x
4 x
5 x

2.4.4 转义字符

[root@linux sjklx]# awk '{print $1"\t"$3}' test.txt
1       x
2       x
3       x
4       x
5       x
 

[root@linux sjklx]# awk '{print $1"\n"$3}' test.txt
1
x
2
x
3
x
4
x
5
x

ps:awk默认扩展正则 转义字符需要双引号才能被正确识别

2.4.5 输出最后一列

[root@linux sjklx]# awk '{print NF}' test.txt
9
9
9
10
11

2.5 awk通过通道处理命令

2.5.1 输出df -h 的第五列磁盘占比

[root@linux sjklx]# df -h|awk '{print $5}'
已用%
0%
0%
1%
0%
31%
1%
22%
1%

2.5.2 取出倒数第二列

[root@linux sjklx]# df -h | awk '{print NF-1}'
5
5
5
5
5
5
5
5
5
[root@linux sjklx]# df -h|awk '{print $(NF-1)}'
已用%
0%
0%
1%
0%
31%
1%
22%
1%
ps:不加括号会直接输出第六列 6-1 的结果 加了括号才能正确输出6-1列

2.6 awk指定分隔符

awk默认分隔符为tab或空格

子命令:-F

        1.awk -F:

        2.awk -F ":"

2.6.1 通过指定分隔符输出列

[root@linux sjklx]# head -5 /etc/passwd > test.txt
[root@linux sjklx]# cat test.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

[root@linux sjklx]# awk -F: '{print $1}' test.txt
root
bin
daemon
adm
lp

2.6.2 通过指定分隔符输出最后一列

[root@linux sjklx]# awk -F: '{print $NF}' test.txt
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin

2.6.3 指定多个分隔符

[root@linux sjklx]# awk -F ":/" '{print $(NF-1),$NF}' test.txt
root bin/bash
bin sbin/nologin
sbin sbin/nologin
var/adm sbin/nologin
var/spool/lpd sbin/nologin

2.6.4 将连续出现1次及1次以上的指定分隔符作为1个整体

[root@linux sjklx]# awk -F "[:/]+" '{print $(NF-1),$NF}' test.txt
bin bash
sbin nologin
sbin nologin
sbin nologin
sbin nologin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值