awk简单使用

awk 这个命令用得比较少,但是某些情况下回很有用。

让我们先创建一个测试文件 awk_test.txt

1
2
3
4
yang,chongqing,2019,01,01,100
kunk,wuzhou,2020,02,02,100
larry,beijing,2015,03,03,200
zinba,beijing,2018,04,04,300

基本参数

基本上只使用了-F这个参数,用于指定分隔符。

1
2
$awk -F "," '{print $1,$2,$3,$4,$5}' awk_test.txt
# 结果 pass

基本用法

打印部分或者全部信息

1
2
3
4
5
$awk -F "," '{print $1,$2,$3,$4,$5}' awk_test.txt
yang chongqing 2019 01 01
kunk wuzhou 2020 02 02
larry beijing 2015 03 03
zinba beijing 2018 04 04

还有几个 tips:

  • $0表示引用一行的全部内容
  • -F 可以使用 -F "[,.]" 来指定多个分隔符

过滤

找到第一列是 kunk 的记录

1
2
$awk -F, '$1 == "kunk"' awk_test.txt
kunk,wuzhou,2020,02,02,100

找到第二列是 beijing 而且 第三列大于 2017 的记录,并输出前两行

1
2
$awk -F, '$2 == "beijing"  && $3 > 2017 {print $1,$2}' awk_test.txt
zinba beijing

利用正则表达式找出第一列带有 a 这个字母的记录,并输出前两行(使用~实现)

1
2
3
4
$awk -F, '$1~/a/ {print $1,$2}' awk_test.txt
yang chongqing
larry beijing
zinba beijing

内建变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$awk -F"," 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  awk_test.txt

FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
awk_test.txt 2 1 , 6 1


awk_test.txt 2 2 , 6 2


awk_test.txt 2 3 , 6 3


awk_test.txt 2 4 , 6 4

为方便处理而出现,可以视为是 awk 定义的一些变量,看需求来使用。

awk 脚本

标准格式如下:

  • BEGIN :处理文件前执行前的语句
  • PROCESS:对每一行数据要做的处理
  • END:文件处理完之后执行的语句

举个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/awk -f
#运行前

BEGIN{
FS = ","
printf "NAME CITY YEAR MONTH DAY\n"
printf "---------------------------------------------\n"

}
{
printf "%-6s %-6s %-6d %-6d %-6d\n",$1,$2,$3,$4,$5

}

END{

printf "---------------------------------------------\n"
}

其结果如下:

1
2
3
4
5
6
7
NAME  CITY YEAR MONTH DAY
---------------------------------------------
yang chongqing 2019 1 1
kunk wuzhou 2020 2 2
larry beijing 2015 3 3
zinba beijing 2018 4 4
---------------------------------------------

当然这只是最简单的用法,现在权当了解,后面有需要的时候再深入学习。

参考链接