Linux文本处理三剑客之awk

发布时间 2023-08-06 17:39:08作者: 百里骑

工欲善其事,必先利其器。

掌握了Linux文本三剑客,可谓是事半功倍。

对于刚接触Linux的同学来说,Linux的各种命令真的时让人望而生畏。工作中看到大神们一通操作猛如虎,各种命令以及参数眼花缭乱。

当我们用过一些命令,但又不熟悉得情况下,这个时候就得从全局入手,看看Linux有哪几类命令,先提纲挈领,至少我们能知道完成什么样得功能我需要用什么命令,至于细节参数,查手册多用几次就熟悉了。而不是每次都束手无策,盲目查找。

今天我们就来看一下Linux对于文本处理的三大利器之一awk。基本上可以满足对文本处理的所有任务。

awk

简介

AWK是Linux强大的文本处理工具,其名称由来取自于三位创始人姓氏的首字母。

命令格式

awk [options] 'pattern {action}' file1 file2, ...
awk [options] 'script' file1 file2, ...

pattern: 模式或条件

action: 对数据处理,常用print

常用内建变量

FS: 列分割符。指定每行文本的字段分割符,默认为空格或者治标位。与“-F”作用相同

NF: 当前处理的行的字段个数;

NR: 当前处理的行的行号;

$0: 当前处理的行的整行内容;

$n: 当前处理行的第n个字段;

FILENAME: 被处理的文件名

基本用法

测试文件test.txt, 注意空格和逗号;

(base) rhett@LAPTOP-MV0SUCM6:~$ cat test.txt
today,is, a sunny, day;
I read,a book, this afternoon;
And plan,to do, some coding,after dinner.
Have a good day.

案例1

按行输出:输出文件的1~3行

(base) rhett@LAPTOP-MV0SUCM6:~$ awk '(NR>=1)&&(NR<=3)' test.txt
today,is, a sunny, day;
I read,a book, this afternoon;
And plan,to do, some coding,after dinner.

案例2

按字段输出:输出每行中的第1、3个字段(默认空格分割符)

(base) rhett@LAPTOP-MV0SUCM6:~$ awk '{print $1,$3}' test.txt
today,is, sunny,
I book,
And do,
Have good

案例3

指定分隔符输出

(base) rhett@LAPTOP-MV0SUCM6:~$ awk -F ',' '{print $1,$2}' test.txt
today is
I read a book
And plan to do
Have a good day.

案例4

输出分段输大于3的行

(base) rhett@LAPTOP-MV0SUCM6:~$ awk -F ',' 'NF>3 {print $1,$2}' test.txt
today is
And plan to do

案例5

输出文件参数

(base) rhett@LAPTOP-MV0SUCM6:~$ awk '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}' test.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
test.txt    2    1         4    1


test.txt    2    2         5    2


test.txt    2    3         6    3


test.txt    2    4         4    4