awk

什么是awk

awk类似于sed,也是一种非交互式的文本编辑器

与sed的相同点:

  • awk也是逐行读入,逐行处理
  • awk只是将其处理结果送至stdout,不会修改任何输入文件
与sed的不同点:

  • sed一般以整行为处理对象;而awk更善于处理分成多个逻辑“字段”的文本,即awk以“字段”为处理对象

awk的一般格式
awk [option] 'awk command' [file]
1.option即awk参数,常用的有:
  • -F :设置FS(字段分隔符,后面介绍)的值,如:
awk -F":" 'awk command' [file]  #将:设为FS(FS默认为一个或多个空格/Tab)
  • -f :使用外部awk脚本执行awk,而不是使用awk command
2.awk command是awk的主体部分
首先要保证其被单引号包括,以避免与shell自带meta冲突
awk command的一般格式为:
[地址]{[操作]}  #正则表达式和布尔表达式
{[地址][操作]}  #if结构
  • 地址:类似于sed,用于指定行号,有以下三种方式:
    • /.../ :只处理正则表达式匹配的行
    • 布尔表达式:只处理使布尔表达式的值为True的行,支持的条件测试有
      • >
      • <=
      • >=
      • ==
      • !=
      • ~ :匹配正则表达式则返回True
      • !~ :不匹配正则表达式则返回True
    • if条件判断:结构与C语言类似。与上面两种方式不同的是,if结构放在花括号之内
使用不同地址指定行号的例子:
awk -F":" '/tae|root/{print $0}' /etc/passwd  #正则表达式
awk -F":" '$1=="tae"{print $0}' /etc/passwd  #布尔表达式
awk -F":" '{if($1=="tae"){print $0}}' /etc/passwd  #if结构
  • 操作:目前仅用到print操作,对于print需要注意的是:与shell不同,若要用print打印除字段外的其他内容,需用双引号包括,如
awk -F":" '/tae|root/{print "This is from "$1}' /etc/passwd
需要牢记几点:
1)awk中可以有多个awk command,它们在单引号内相互用空格分隔,形如
awk [option] '[awk command 1] [awk command 2]' [file]
2)在awk command中,可对同一地址进行多个操作,相互之间用分号分隔,形如
[地址]{[操作1]; [操作2]}  #正则表达式和布尔表达式
{[地址]{[操作1]; [操作2]}}  #if结构
3)地址和{之间没有空格
4) 地址不是强制要求的,若缺省则表示该awk command会对输入文件的每一行都进行处理
5)布尔表达式可以使用复合测试条件&&和||,如:
awk -F":" '($1=="tae")&&($2=="x"){print $0}' /etc/passwd
3.综上所述,awk的完整格式为:
awk [option] 'BEGIN{...} [地址 1]{[操作 1]; ...; [操作 n]} ... [地址 m]{[操作 1]; ...; [操作 n]} END{...}' [file]

字段变量
awk中
$0表示整个当前行
$1表示第一个字段,$2表示第二个字段,……以此类推
字段的分隔由FS决定

BEGIN和END
BEGIN:awk在开始处理文件之前会执行BEGIN块,因此BEGIN块一般用于初始化之后awk会用到的全局变量(如FS)
END块:awk在处理完所有行后会执行END块,因此END块一般用于执行最终计算或在输出流结尾处打印摘要信息
BEGIN和END不是强制要求的

全局变量
awk的全局变量主要用于捕获输入信息和格式化输出,主要有:
  • FS:输入字段分隔符,默认为”一个或多个Space/Tab“,需要注意两点:
    • FS不一定是单一字符
    • FS可以是一个正则表达式
  • OFS:输出字段分隔符(即取代print中的逗号),默认为空格,如
awk 'BEGIN{FS=":"} /tae/{print $1,$2,$3}' /etc/passwd  #awk将默认地以空格分隔打印三个字段
awk 'BEGIN{FS=":"; OFS="---"} /tae/{print $1,$2,$3}' /etc/passwd  #三个字段以"---"为分隔被打印
  • RS:输入记录分隔符:告诉awk当前记录什么时候结束,新记录什么时候开始
  • ORS:输出记录分隔符:默认为回车换行
  • NF:用于记录当前行的字段的数量
  • NR:用于记录当前行的行号

其他
awk会智能地将变量的值在字符串和数值之间转换
awk支持很多数值运算符,包括取模%,自增减,指数运算^
awk支持类似C语言的printf
awk捕获输入数据的准确性取决于FS和RS的设置


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值