三剑客之awk的常规用法

                                                      三剑客之awk的常规用法

AWK有多种版本:

AWK:原先来源于 AT & T 实验室的的AWK

NAWK:New awk,AT & T 实验室的AWK的升级版

GAWK:即GNU AWK。所有的GNU/Linux发布版都自带GAWK,它与AWK和NAWK完全兼容

目前主流发行版LINUX中使用的都是GAWK

gawk:模式扫描和处理语言,可以实现下面功能

1.文本处理

2.输出格式化的文本报表

3.执行算数运算

4.执行字符串操作

awk的格式

awk [options]   'program' var=value   file…
awk [options]   -f programfile    var=value file…
#常用选项
-f progfile|--file progfile #从文件中读入
program
-F fs|--field-separator fs #指定分隔符,默认是
空白符,可以指定多个
-v var=val|--asign var=val #设置变量

program用法

program 通常放在单引号中,由三部份组成,分别是BEGIN{}[pattern]{COMMAND}END{},这三部份可以
没有或都有
awk '' /etc/issue
awk 'BEGIN{print "begin"}' /etc/issue
awk '{print $0}' /etc/issue
awk 'END{print "end"}' /etc/issue
awk 'BEGIN{print "begin"}{print $0}END{print "end"}' /etc/issue

Program格式:

pattern{action statements;..}
pattern                 #定义条件,只有符合条件的记录,才会执行后面的
action
action statements       #处理数据的方式,常见如 print,printf等

awk 工作过程

1. 执行BEGIN{action;… }语句块中的语句

2. 从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从 第一行到最后一行重复这个过程,直到文件全部被读取完毕。

3. 当读至输入流末尾时,执行END{action;…}语句块

BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打 印输出表格的表头等语句通常可以写在BEGIN语句块中。

END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总 都是在END语句块中完成,它也是一个可选语句块。

pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

常用的内置变量:

FILENAME, FS , RS ,OFS , ORS , OFMT , NF , NR , FNR , ARGC, ARGV

~#左边是否和右边匹配,包含关系          !~ #是否不匹配

三目表达式

selector?if-true-expression:if-false-expression

awk -F: '{$3>=1000?utype="Common":utype="Sys"; printf "%-20s:%12s\n",$1,utype}' /etc/passwd root               :         Sys bin                 :         Sys daemon             :         Sys adm                 :         Sys

df|awk -F"[ %]+" '/^\/dev\/sd/{$(NF-1)>10? disk="full":disk="OK";print $(NF-1),disk}'

26 full

3 OK

1 OK

13 full

模式PATTERN

PATTERN:根据pattern条件,过滤匹配的行,再做处理,如果没有指定,则匹配每一行

[root@ubuntu2204 ~]# awk '{print $0}' /etc/issue
Ubuntu 22.04 LTS \n \l
[root@ubuntu2204 ~]# awk 'NR==1{print $0}' /etc/issue
Ubuntu 22.04 LTS \n \l

正则匹配

范例:用正则匹配,正则表达式需要用/ / 来锚定开始结束

[root@rocky86 ~]# awk '/^UUID/{print $1}' /etc/fstab
UUID=94a73757-555a-4d2b-8153-f54277c4c50d
#非空行,非注释行
[root@rocky86 ~]# awk '!/^$|^#/{print $1}' /etc/fstab
/dev/mapper/rl-root
UUID=94a73757-555a-4d2b-8153-f54277c4c50d
/dev/mapper/rl-home
/dev/mapper/rl-swap

关系表达式

关系表达式,结果为“真”才会被处理 真:结果为非0值,非空字符串 假:结果为0值或空字符串

#false 这里表示的是一个未定义的变量,不是表示bool值
[root@ubuntu2204 ~]# seq 3 | awk 'false'
[root@ubuntu2204 ~]# seq 3 | awk -v false=123 'false'
1
2
3
#false 这里表示的是字符串
[root@ubuntu2204 ~]# seq 3 | awk '"false"'
1
2
3
[root@ubuntu2204 ~]# seq 3 | awk '""'
[root@ubuntu2204 ~]# seq 3 | awk '" "'
1
2
3
[root@ubuntu2204 ~]# seq 3 | awk '"0"'
1
2
3
[root@ubuntu2204 ~]# seq 3 | awk '0'
#这里true 是变量名,一个不存在的变量
[root@ubuntu2204 ~]# seq 3 | awk 'true'
[root@ubuntu2204 ~]# seq 3 | awk -v true=123 'true'
1
2
3
[root@ubuntu2204 ~]# seq 3 | awk '123'
1
2
3
[root@ubuntu2204 ~]# seq 3 | awk 'mage'
[root@ubuntu2204 ~]# seq 3 | awk -v mage="mage" 'mage'
1
2
3
[root@ubuntu2204 ~]# seq 3 | awk -v mage="" 'mage'
[root@ubuntu2204 ~]# seq 3 | awk -v mage=" " 'mage'
1
2
3
[root@ubuntu2204 ~]# seq 3 | awk -v mage=0 'mage'

BEGIN/END模式

BEGIN{}:仅在开始处理文件中的文本之前执行一次

END{}:仅在文本处理完成之后执行一次

#只有begin 时,可以没有输入内容
[root@ubuntu2204 ~]# awk 'BEGIN{print "begin"}'
begin
#需要后续输入
[root@ubuntu2204 ~]# awk 'BEGIN{print "begin"}{}'
begin
[root@ubuntu2204 ~]# awk 'BEGIN{print "begin"}{print $0}END{print "end"}' 
/etc/issue
begin
Ubuntu 22.04 LTS \n \l
end
[root@ubuntu2204 ~]# awk -F:   'BEGIN{printf "--------------------------------
\n%-20s|%10s|\n--------------------------------\n","username","uid"}{printf 
"%-20s|%10d|\n--------------------------------\n",$1,$3}' /etc/passwd
--------------------------------
username           |       uid|
--------------------------------
root               |         0|
--------------------------------
daemon             |         1|
--------------------------------
bin                 |         2|
--------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白了个白i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值