返回介绍

Hack-22 Awk 简介

发布于 2025-03-08 17:38:21 字数 5883 浏览 0 评论 0 收藏 0

Awk 简介

简介

  Awk stands for the names of its authors “Aho, Weinberger, and Kernighan”

Awk 也是一种编程语言,他能让你格式化数据以及生成特定格式的报告.(翻译的好糙...)

总之,你只需要记住它是用来格式化数据的就 OK 了。

Awk 更像是一个过滤器,它把读入的数据一行一行的过滤,匹配你想要的内容,如果匹配到了,那就格式化输出,匹配不到的就忽略。

Awk 有一些特性:

  • 它把数据视为 '记录' 和 '字段'
  • 它也有变量,条件和循环。
  • 它有数学操作符和字符串操作符
  • 它能生成格式化的报告
  • 它从标准输入读取数据,把过滤之后的数据从标准输出打印出来,不处理空文件。

基本语法:

awk '/search pattern1/ {Actions} /search pattern2/ {Actions}' file

其中:

  • search pattern 是要匹配的字符串
  • Actions 是匹配到之后所进行的动作
  • 它能处理多个匹配和行为
  • file 是值输入文件
  • 单引号的作用是防止里面的特殊字符被 shell 处理

Awk 的工作方法

  1. Awk 每次从输入文件中读取一行。
  2. 对于每一行,如果匹配到了相应的内容,就会执行相应的动作。
  3. 如果匹配不到,就什么也不做。
  4. 在上面的语法中,匹配项和动作有一即可。
  5. 如果没有给出匹配项, Awk 就会把每一行按照给定的动作执行
  6. 如果动作没有给出,默认是打印。
  7. 如果大括号里面是空的,那就什么也不干.(因为这样就代表给出了一个空的动作)
  8. 在大括号里的每一个动作需要用分号( ; ) 隔开。

然后我们开始举栗子:

先是有这样一个文件:

➤ cat awk.txt 
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000

打印每一行

➤ awk '{print;}' awk.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000
➤

这里我们没有给出匹配项,仅给出了动作, print 打印。

打印匹配到的行

➤ awk '/Thomas/;/Nisha/' awk.txt
100 Thomas Manager Sales $5,000
400 Nisha Manager Marketing $9,500

这里跟原著有点不太一样,原著是用回车把每一个要匹配的内容分开的,但是这样不好修改,看起来也怪怪的,所以,不如直接用分号把他们隔开啦~

上面的栗子打印了匹配到那两个名字的行(记录).

打印特定的字段(列)

这个例子打印了第 2 和第 5 个字段。

➤ awk '{print $2,$5}' awk.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000

再看下面这个例子:

➤ awk '{print $3,$NF}' awk.txt
Manager $5,000
Developer $5,500
Sysadmin $7,000
Manager $9,500
DBA $6,000

有点不一样了是吧? $NF 的意思是最后一个字段。

每个字段都要用逗号( , ) 分开。

开始和结束

awk 有一种特定的语法,开始和结束。

BEGIN { Actions}
{ACTION} # 文件中的每一行默认的动作
END { Actions }

有什么用呢? 正如表述所言, 开始 定义了输出一开始的动作,而 结束 则定义了输出结束时的动作。

比如:

➤ awk 'BEGIN {print "Name\t Designation\tDepartment\tSalary";} {print $2,"\t",$3,"\t",$4,"\t",$NF;} END{print "Report Generated\n--------------";}' awk.txt 
Name     Designation    Department    Salary
Thomas      Manager      Sales      $5,000
Jason      Developer      Technology      $5,500
Sanjay      Sysadmin      Technology      $7,000
Nisha      Manager      Marketing      $9,500
Randy      DBA      Technology      $6,000
Report Generated
--------------

如果太长了,中间可以用回车隔开:

$ awk 'BEGIN {print
"Name\tDesignation\tDepartment\tSalary";}
> {print $2,"\t",$3,"\t",$4,"\t",$NF;}
> END{print "Report Generated\n--------------";
> }' employee.txt
Name Designation Department Salary
Thomas Manager Sales $5,000
Jason Developer Technology $5,500
Sanjay Sysadmin Technology $7,000
Nisha Manager Marketing $9,500
Randy DBA Technology $6,000
Report Generated
--------------

条件语句

awk 也有条件语句,比如比较大小:

➤ awk '$1 >= 200' awk.txt 
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000

上面的例子是打印第一个字段大于等于 200 的行。

再看下面这个例子,是对字符串进行比较的:

➤ awk '$4 ~ /Tech/' awk.txt 
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
500 Randy DBA Technology $6,000

有点像 [[ ]] 里面的正则匹配,好像就是正则匹配...

➤ awk '$4 ~ /[tT][abcde]/' awk.txt 
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
500 Randy DBA Technology $6,000

有点意思了,是吧!

计数!

awk 既然是一种编程语言,那基本的计数也是应该的:

➤ awk 'BEGIN { count=0;} $4 ~ /Tech/ { count++; } END { print "Number of employees in Technology Dept=",count;}' awk.txt 
Number of employees in Technology Dept= 3
➤ awk 'BEGIN { count=0;}
> $4 ~ /Tech/ { count++; } 
> END { print "Number of employees in Technology Dept=",count;}' awk.txt
Number of employees in Technology Dept= 3

附言

awk 作为一门编程语言,这点介绍仅仅是皮毛而已,就像,虽然你学了点 C 语言,能输出个 12345 了,可 C 能做的可不是这么简单. :)

(我也只是学了点皮毛...)

扩展阅读

(这些扩展阅读也都是原作者自己写的,很厉害的一个家伙!

本书简介:

  • Linux 进阶技巧
  • 巧妙的命令组合
  • Bash 某些技巧
  • 一共一百零一个(包括充数的)
  • 最后有个奖励章(额外技巧)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文