awk命令使用

警告
本文最后更新于 2020-12-17 18:45,文中内容可能已过时。

原文链接:http://www.ruanyifeng.com/blog/2018/11/awk.html

基本用法

awk是一行一行处理数据的

1
2
3
4
5
6
# 格式
$ awk 动作 文件名

# 示例
$ echo 'this is a test' | awk '{print $1}'
this

常见变量

0: 完整的内容 $n: 分割后的内容$1就是第一部分.$2就是第二部分 FILENAME:当前文件名 FS:字段分隔符,默认是空格和制表符。也可以-F参数来修改 RS:行分隔符,用于分割每一行,默认是换行符。 OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。 ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。 OFMT:数字输出的格式,默认为%.6g。(%f 后面如果不满6位小数就补0,%g 不补0不显示)

NF: NF代表当前有多少列(小技巧:$NF代表最后一列的内容) 打印第一列和倒数第二列,,代表使用空格分割显示

1
2
3
4
5
awk -F ':' '{print $1, $(NF-1)}' /etc/passwd
root /root
bin /bin
daemon /sbin
adm /var/adm

NR: 当前处理的是第几行

函数

toupper():字符转换为大写 tolower():字符转为小写 length():返回字符串长度 substr():返回子字符串 sin():正弦 cos():余弦 sqrt():平方根 rand():随机数

awk内置函数的完整列表,可以查看手册

1
2
3
4
5
awk -F ':' '{ print toupper($1) }' /etc/passwd
ROOT
BIN
DAEMON
ADM

条件

awk允许指定输出条件,只输出符合条件的行。

输出条件要写在动作的前面。

1
awk '条件 动作' 文件名

请看下面的例子。

1
2
3
4
5
$ awk -F ':' '/usr/ {print $1}' /etc/passwd
root
daemon
bin
sys

上面代码中,print命令前面是一个正则表达式,只输出包含usr的行。

下面的例子只输出奇数行,以及输出第三行以后的行。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 输出奇数行
$ awk -F ':' 'NR % 2 == 1 {print $1}' /etc/passwd
root
bin
sync

# 输出第三行以后的行
$ awk -F ':' 'NR >3 {print $1}' /etc/passwd
sys
sync

下面的例子输出第一个字段等于指定值的行。

1
2
3
4
5
6
7
awk -F ':' '$1 == "root" {print $1}' /etc/passwd
root

# 或者
awk -F ':' '$1 == "root" || $1 == "bin" {print $1}' /etc/passwd
root
bin

if 语句

awk提供了if结构,用于编写复杂的条件。

1
2
3
4
$ awk -F ':' '{if ($1 > "m") print $1}' /etc/passwd
root
sys
sync

上面代码输出第一个字段的第一个字符大于m的行。

if结构还可以指定else部分。

1
2
3
4
5
6
awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt
root
---
---
sys
sync

预处理BEGIN和后处理END

1
2
3
4
5
# 格式
awk 'BEGIN{处理前} {处理中} END{处理后}' /etc/passwd

# 示例
awk -F: 'BEGIN{print "处理前"} {print $1,"处理中"} END{处理后}' /etc/passwd

循环

1
2
awk '{total = 0 for (var = 1; var < 5; var++){total += $var}
avg = total / 3 print "Average:",avg }' testfile
请我喝杯水
SoulChild 微信号 微信号
SoulChild 微信打赏 微信打赏
0%