linux awk 命令常见用法

在 linux 系统中,有三个强大的文本分析处理工具:grep  sed  awk,其中:

grep   用于搜索文本内容      =>     linux grep 命令常见用法

sed    用于编辑文本内容       =>     linux sed  命令常见用法

awk   用于处理和生成报表    =>     linux awk 命令常见用法

 

awk 的工作原理是将文件内容逐行读入,然后以每一行中的空格为分隔符将每行数据切分成几列,再对每列的元素进行各种分析处理。

下面结合实例简单介绍 awk 命令常用的几种格式:

假设文件 form.txt 中有如下内容:

Num  Name  Company  Product
1    Jobs  Apple    iPhone
2    Jack  Alibaba  taobao
3    Pony  Tencent  wechat

 

1. 打印第二列和第三列:

awk  '{print $2 $3}'  form.txt
>> NameCompany JobsApple JackAlibaba PonyTencent

awk 的命令都写在单引号内,再用花括号括起来,这里的 $2 $3 分别表示第二列和第三列, $0 则表示整行;

可以看到第二列和第三列就打印出来了,但是两列数据紧贴在一起,如果我们希望以制表符来分隔开:

awk  '{print $2"\t"$3}'  form.txt
>> Name Company Jobs Apple Jack Alibaba Pony Tencent

注意制表符 \t 需要用双引号括起来

 

2. 打印出第 2,3,4 行的第二列和第三列,以制表符分隔开:

awk  '/^[0-9]/{print $2"\t"$3}'  form.txt
>>
Jobs    Apple
Jack    Alibaba
Pony    Tencent

这里用到了 awk 的一种常用语法:  awk  ‘ 样式{命令}’  file 

表示从文件 file 中取出那些符合 “样式” 的行,然后对这些行执行{命令}

这里的 “样式” 一般是正则表达式,用定界符 / / 括起来,命令依然是用花括号括起来

所以上面这个例子就表示:取出那些以数字开头的行,打印这些行的第二列和第三列,并以制表符分隔开

 

3. 打印出前三行的第二列和第三列:

awk  '{ if (NR<=3)  {print $2"\t"$3} }'  form.txt
>>
Name    Company
Jobs    Apple
Jack    Alibaba

这里用到了 awk 编程,在花括号内写了一小段程序,awk 编程基本都是借鉴 C 语言,所以 C 语言中常见的 if  for while 等控制结构都可以直接借用。

这个例子中还用到了awk 内嵌特殊变量 NR,NR 记录的是当前行号,awk还有很多其他的内嵌变量,比如 NF 表示当前行有多少列。

在数字后端设计中,经常需要从一些 report 中抓出某几行的某一列数据,比如 timing report 中的 cell name 或者 pin name,此时就很适合用这种简短的 awk 编程来处理。

 

4. BEGIN END 语句块

使用 awk 命令时也经常会用到 BEGIN / END 语句块,例如:

打印第二列和第三列,且在打印第一行之前先打印出字符串“ Start:”, 打印完最后一行后接着打印出字符串 “ End " :

awk 'BEGIN { print "Start:" }  { print $2"\t"$3}  END {print "End"}'  form.txt
>>
Start:
Name    Company
Jobs    Apple
Jack    Alibaba
Pony    Tencent
End

 

5. 使用 “非空格字符” 切分列

默认情况下,awk 命令读入一行数据后,会用这行中的空格将整行数据切分成若干列,但是有些数据不是以空格作为间隔的,比如下面这组:

Num,Name,Company,Product
1,Jobs,Apple,iPhone
2,Jack,Alibaba,taobao
3,Pony,Tencent,wechat

此时,如果想要打印出第二列和第三列,就需要使用选项 “ -F ” 来指定分隔符:

awk  -F","  '{print $2"\t"$3  }'  form.txt
>>
Name    Company
Jobs    Apple
Jack    Alibaba
Pony    Tencent

这里的选项  -F ","  就表示以每行数据中的逗号为分隔符,来切分数据。

 

 

awk 命令的用法非常多,可以实现非常复杂的报表分析处理,这里只介绍了最常见的几种用法,

如果希望深入了解,可以参考awk编程相关书籍,或者直接访问GNU awk 官网:

  http://www.gnu.org/software/gawk/manual/gawk.html

 

 

 

 

 

 

|------------------------------------------|

 

posted @ 2020-05-15 17:57  いつまでも  阅读(2863)  评论(0编辑  收藏  举报