Linux命令-awk

awk 是一个强大的文本分析工具,主要用于数据扫描、过滤、统计汇总工作,数据可以来自标准输入、管道或者文件。

首先理解一下两个概念:

  • 记录:文件的每行数据都被称为记录,awk 每次从文件中读取一条记录(行)。
  • 字段:每条记录(行)被分成若干字段(列),默认以空格或制表符为分隔符(也可以通过 -F 选项指定分隔符)

语法awk [选项] '/pattern1/{action1} /pattern2/{action2} ...' filename

选项

  • -F: 指定输入文件中每条记录的字段之间的分割符
  • -v: 定义一个用户变量

awk 的内置变量

  • FILENAME 当前输入文档的文件名
  • NR 读取到的行记录数,也就是行数
  • NF 读取到的以分隔符切割出来的列的记录数,也就是列数
  • $0 当前行的全部数据
  • $n 当前行的第n个字段的内容
  • RS 输出字段

/etc/passwd 文件中,所有行中,以冒号(:)为分隔符,的第 1 列和第 7 列,进行打印操作,注意 -F 与分隔符冒号(:)之间的空格可用可不用。

$ cat /etc/passwd | awk -F : '{print $1,$7}'
root /bin/bash
daemon /usr/sbin/nologin
bin /usr/sbin/nologin
sys /usr/sbin/nologin
...省略输出...
  • 因为没有指定/pattern/,也就是匹配每条记录的意思。
  • print 操作符可以打印变量,如果变量之间用逗号(,)隔开,则打印出来的变量会自动以空格隔开两个变量。

/etc/passwd 文件中,以 bin 开头的行中,以冒号(:)为分隔符,的第 1 列和第 7 列,进行打印操作

$ cat /etc/passwd | awk -F : '/^bin/{print $1 "," $7}'
bin,/usr/sbin/nologin

/etc/passwd 文件中,以 bin 开头的行中,以冒号(:)为分隔符,的行号(用到内置变量 NR )以及第 1 列和第 7 列,进行打印操作

$ cat /etc/passwd | awk -F : '/^bin/{print NR "," $1 "," $7}'
3,bin,/usr/sbin/nologin

BEING 和 END

awk 可以通过 BEINGEND 在分析读取文本之前以及之后执行一次 {action} 操作,一般用 BEGIN 来进行初始化,用 END 来进行汇总。

$ cat /etc/passwd | awk -F: 'BEGIN{print "打印 bin 用户登录权限"} /^bin/{print NR "," $1 "," $7} END{print "共有 "NR" 行"}'
打印 bin 用户登录权限
3,bin,/usr/sbin/nologin
共有 48 行

自定义用户变量

$ cat /etc/passwd | awk -v a="自定义变量" '{print a}'
自定义变量
自定义变量
自定义变量
...省略输出...

你会发现这条语句会打印48行的"自定义变量",因为它读取了48次(也就是每行都读取并打印一次)

分割符变量

awk 为输入、输出分隔符指定了变量名,并赋予了默认值,其中:

  • RS :输入记录的分隔符,默认为行(\n);
  • ORS :输出记录的分隔符,,默认也为行(\n);
  • OFS :输出字段的分隔符,默认为空格。

为什么没有输入字段分割符的变量?因为这个分隔符是直接通过 -F 选项来指定的。

我们对上一条命令的输出记录分隔符指定为空格

$ cat /etc/passwd | awk -v a="自定义变量" -v ORS=" " '{print a}'
自定义变量 自定义变量 自定义变量 自定义变量 ...省略输出...

指定多个分隔符

awk 可以通过 [] 来指定多个分割符,下面的命令指定了左中括号 ([) 和右中括号 (]) 作为分隔符。

$ echo [abc][def][ghi] | awk -F [][] '{print $2}'
abc
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值