Shell正则三剑客 | awk命令

18 篇文章 0 订阅

AWK命令

awk 具有 grep 和 sed命令的特性,同时 AWK针对列进行匹配

语法格式

Usage : awk [options] -f progfile [–] file …
Usage : awk [options] [–] ‘program’ file …

常用选项

  • -F fs fs指定输入分隔符,fs可以是字符串或正则表达式;如-F “:”

  • -vvar=value 赋值一个用户定义变量,将外部变量传递给awk

  • -f progfile 从脚本文件中读取awk命令

  • -m[fr]val 对val值设置内在限制;

  • -mf选项限制分配给val的最大块数目;

  • -mr选项限制记录最大数目;

  • 此选项为awk的扩展功能,在标准awk中不适用;

    awk使用案例

$1 2... 2... 2...n 表示字段;$0 表示所有字段
head -n2 test.txt | awk -F “:” ‘{print $0}’
head -n2 test.txt | awk -F “:” ‘{print $1}’

输入字段分隔符
head -n2 test.txt | awk -F “:” ‘{print $1"#"$2"#"$3}’
head -n2 test.tt |awk -F “:” ‘{OFS="#"}{print $1,$2,$3}’
字符串过滤【具有grep过滤功能】
awk -F “:” ‘/root/’ test.txt
awk -F “:” ‘$1 ~/root/’ test.txt

awk的数学运算
echo “2 3” | awk ‘{print($1+$2)}’
echo “10 3” | awk ‘{print($1%$2)}’
awk -F “:” ‘$3>$4’ /etc/passwd
awk -F “:” ‘$3>800 || $7=="/bin/bash/"’ /etc/passwd
awk -F “:” ‘$7!="/sbin/nologin"’ /etc/passwd

if判断用例
awk -F “:” ‘{if($1==“root”){print $0}}’ test.txt
awk -F “:” ‘{if ($3>=20){print $3}}’ test.txt
awk的循环
awk -F “:” ‘{(tot=tot+$3)}; END {print tot}’ test.txt

awk小练习
打印行号【awk/grep实现】

awk写法
[root@nextcloud shell]# awk -F “:” ‘/root/{print NR":" $0}’ /etc/passwd
1:root❌0:0:root:/root:/bin/bash
10:operator❌11:0:operator:/root:/sbin/nologin
grep写法
[root@nextcloud shell]# grep -n ‘root’ /etc/passwd
1:root❌0:0:root:/root:/bin/bash
10:operator❌11:0:operator:/root:/sbin/nologin

匹配包含 root 的行【awk/grep实现】

awk写法
awk -F “:” ‘/root/’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
grep写法
grep -n ‘root’ /etc/passwd
1:root❌0:0:root:/root:/bin/bash
10:operator❌11:0:operator:/root:/sbin/nologin

匹配第一字段为 root的行

awk -F “:” ‘$1 ~/root/’ /etc/passwd
root❌0:0:root:/root:/bin/bash

匹配包含root 或 bash 的行【awk/grep实现】

awk写法(一)
[root@nextcloud shell]#awk -F “:” ‘/root|bash/{print $0}’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
shudun❌1000:1000:shudun:/home/shudun:/bin/bash
www-data❌1001:1001::/home/www-data:/bin/bash
awk写法(二)
[root@nextcloud shell]# awk -F “:” ‘/root/ || /bash/ {print $0}’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
shudun❌1000:1000:shudun:/home/shudun:/bin/bash
www-data❌1001:1001::/home/www-data:/bin/bash
grep写法
[root@nextcloud shell]# grep -E “root|bash” /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
shudun❌1000:1000:shudun:/home/shudun:/bin/bash
www-data❌1001:1001::/home/www-data:/bin/bash

匹配数学运算【awk/grep实现】

匹配 $3等于字符串0 [root@nextcloud shell]# awk -F “:” ‘$3==“0”’ /etc/passwd
root❌0:0:root:/root:/bin/bash 匹配 $3 大于等于字符串 10 [root@nextcloud
shell]# head -n 5 /etc/passwd | awk -F “:” ‘$3>=“10”’
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin 匹配 $3 大于等于数字 10 head -n 5
/etc/passwd | awk -F “:” ‘$3>=10’ 匹配$7字段 不等于字符串·/bin/nologin
[root@nextcloud shell]# head -n 5 /etc/passwd | awk -F “:”
‘$7!="/bin/nologin"’ root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin

匹配字段添加分隔符

方法1
[root@nextcloud shell]# awk -F “:” ‘{OFS="#"}/root|bash/{print $1,$2,$5}’ /etc/passwd
root#x#root
operator#x#operator
shudun#x#shudun
www-data#x#
方法2
awk -F “:” ‘/root|bash/{print $1"#"$2"#"$5}’ /etc/passwd
root#x#root
operator#x#operator
shudun#x#shudun
www-data#x#

匹配条件字段

awk -F “:” ‘{OFS="#"}{if ($3>800){print $1,$3,$7}}’ /etc/passwd
polkitd#999#/sbin/nologin
libstoragemgmt#998#/sbin/nologin
chrony#997#/sbin/nologin
shudun#1000#/bin/bash
www-data#1001#/bin/bash
saslauth#996#/sbin/nologin
dovenull#995#/sbin/nologin

NR和$NR区别

  • NR 表示,只打印行号
  • $NR 表示,根据当前行号打印相应字段(比如:第1行,打印 $1字段;第2行,打印$2字段)

NR表示,只打印行号
[root@nextcloud shell]# head -6 /etc/passwd |awk -F “:” ‘{print NR $0}’
1root❌0:0:root:/root:/bin/bash
2bin❌1:1:bin:/bin:/sbin/nologin
3daemon❌2:2:daemon:/sbin:/sbin/nologin
4adm❌3:4:adm:/var/adm:/sbin/nologin
5lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
6sync❌5:0:sync:/sbin:/bin/sync
匹配NR 大于 20 的行
[root@nextcloud shell]# awk -F “:” ‘NR>20 {print NR $0}’ /etc/passwd
21postfix❌89:89::/var/spool/postfix:/sbin/nologin
22ntp❌38:38::/etc/ntp:/sbin/nologin
23chrony❌997:995::/var/lib/chrony:/sbin/nologin
24tcpdump❌72:72:😕:/sbin/nologin
25shudun❌1000:1000:shudun:/home/shudun:/bin/bash
26mysql❌27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
27www-data❌1001:1001::/home/www-data:/bin/bash
28saslauth❌996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
29dovecot❌97:97:Dovecot IMAP server:/usr/libexec/dovecot:/sbin/nologin
30dovenull❌995:992:Dovecot’s unauthorized user:/usr/libexec/dovecot:/sbin/nologin
$NR 表示,根据当前行号打印相应的字段
[root@nextcloud shell]# head -6 /etc/passwd |awk -F “:” ‘{print $NR,$0}’
root root❌0:0:root:/root:/bin/bash
x bin❌1:1:bin:/bin:/sbin/nologin
2 daemon❌2:2:daemon:/sbin:/sbin/nologin
4 adm❌3:4:adm:/var/adm:/sbin/nologin
lp lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
/sbin sync❌5:0:sync:/sbin:/bin/sync

1.NR表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此默认的就是读取的数据行数,NR可以理解为Number of Record的缩写。
2.在awk处理多个输入文件的时候,在处理完第一个文件后,NR并不会从1开始,而是继续累加,因此就出现了FNR,每当处理一个新文件的时候,FNR就从1开始计数,FNR可以理解为File Number of Record。
3.NF表示目前的记录被分割的字段的数目,NF可以理解为Number of Field。

首先准备两个输入文件class1和class2,记录了两个班级的成绩信息,内容分别如下所示:

现在要查看两个班级的所有成绩信息,并在每条信息前加上行号,则可以使用下面的awk指令

[root@nextcloud shell]# cat class1
zhoujielun 85 87
chenglong 87 88
liubei 90 86
[root@nextcloud shell]# cat class2
mayun 92 87 90
guoda 99 96 92
geyou 91 95 99
[root@nextcloud shell]# awk '{print NR,$0}' class1 class2
1 zhoujielun 85 87
2 chenglong 87 88
3 liubei 90 86
4 mayun 92 87 90
5 guoda 99 96 92
6 geyou 91 95 99

这里的行号就是通过NR来实现的,awk每读取一条记录,NR的值便加一。如果要求每个班级的行号从头开始变化,则需要使用FNR来实现,如下:

[root@nextcloud shell]# awk '{print FNR,$0}' class1 class2
1 zhoujielun 85 87
2 chenglong 87 88
3 liubei 90 86
1 mayun 92 87 90
2 guoda 99 96 92
3 geyou 91 95 99

下面的示例结合awk内建变量FILENAME,显示出来的两个班级的成绩信息可以进行更好的区分:

[root@nextcloud shell]# awk '{print FILENAME,"NR="NR,"FNR="FNR,"$"NF"="$NF}' class1 class2
class1 NR=1 FNR=1 $3=87
class1 NR=2 FNR=2 $3=88
class1 NR=3 FNR=3 $3=86
class2 NR=4 FNR=1 $4=90
class2 NR=5 FNR=2 $4=92
class2 NR=6 FNR=3 $4=99

awk的条件判断使用

判断,如果$1字段 等于 字符串root 则打印
[root@nextcloud shell]# awk -F “:” ‘{if($1==“root”){print $0}}’ /etc/passwd
root❌0:0:root:/root:/bin/bash
判断,如果$3字段 大于 数字20 则打印
[root@nextcloud shell]# awk -F “:” ‘{if($3>=20){print $3}}’ /etc/passwd
99
192
81
999
998
173
32
74
89
38
997
72
1000
27
1001
996
97
995

awk的循环

求和 文件所有第3列
[root@nextcloud shell]# awk -F “:” ‘{(i=i+$3)}; END {print i}’ /etc/passwd
8033

更多awk用法可参考:http://man.linuxde.net/awk

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值