【无标题】

10个超级棒的Awk命令

聆听世界的鱼 [Linux公社](javascript:void(0)😉

Linux公社

微信号 linuxidc_com

功能介绍 Linux公社是专业的Linux公众号,发布最新Linux资讯,包括C++、Python、Java、MySQL、Linux教程、Kubernetes、大数据、Nginx、职场,招聘等。

2021-04-14 08:18 发表于

收录于合集

#Linux 733 个

#Linux命令 82 个

点击上方Linux公社 关注我们

Awk命令是处理数据的强大工具。它获取输入数据,对其进行操作,并在标准输出中给出结果。可以对文件的行和列执行各种操作。

要有效地处理数据,了解“awk”命令的基本要素是非常重要的,这篇文章将涵盖“awk”命令的关键特性。让我们先看看语法:

$ awk [options] [file]

下表列出了一些常用的选项:

选项说明
-FTo specify a file separator
-f指定包含“awk”脚本的文件
-v 指定变量

让我们看一些有关“ awk”命令用法的示例,为了演示,我新建了一个文本文件,名称为linuxmi.com.txt:

1、如何使用awk命令打印文件的列?

“ awk”命令可用于获取文本文件的特定列。要打印文件的内容,请使用:

linuxmi@linuxmi:~/www.linuxmi.com$ cat linuxmi.com.txt

图片

现在,打印文件的第二列,使用:

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘{print $2}’ linuxmi.txt

图片

要打印多个字段,使用命令:

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘{print $1,$2,$3}’ linuxmi.txt

图片

如果你不使用逗号“,”,那么输出将没有空格:

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘{print $1$2$3}’ linuxmi.txt

图片

更新地址:https://www.linuxmi.com/10-awk-mingling.html

2、如何使用正则表达式与awk命令:

为了匹配字符串或任何表达式,我们使用斜杠" // ",例如,如果你想打印正在学习"lishi"的人的名字,那么使用:

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘/历史/{print $2}’ linuxmi.txt
张三
方咪

图片

输出清楚地表明,只有“张三”和“方咪”正在学习“历史”课程。

3、如何通过“awk”命令使用关系表达式:

为了匹配特定字段的内容,可以使用关系表达式。要将任何字符串或表达式与字段进行匹配,请指示该字段,并使用比较符“〜”与以下命令中显示的模式进行比较:

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘$3 ~/语/ {print $2}’ linuxmi.txt
陈明
鱼鱼

图片

上面的输出显示第2列中的每个字段与第3列中包含“语”的每个字段的对比。

要获得上述命令的相反输出,请使用“! ~”运算符:

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘$3!~/语/ {print $2}’ linuxmi.txt

图片

为了进行比较,我们还可以使用大于“>”,小于“ <”和等于“ =”的运算符:

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘$4>81 {print $2}’ linuxmi.txt
李华
方咪

图片

输出显示了获得81分以上得分的人员的姓名。

4、如何通过awk命令使用范围模式:

范围也可以用于搜索;只需使用逗号“,”来分隔范围,如下面提到的命令所示:

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘/李四/,/陈明/ {print $3}’ linuxmi.txt

输出显示第2列中从“李四”到“陈明”之间的课程。请参见下面的示例:

图片

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘$487,$491 {print $2}’ linuxmi.txt

输出显示第2列中人员的姓名,第4列中标记“ 87到91”的范围。

![图片](data:image/svg+xml,%3C%3Fxml version=‘1.0’ encoding=‘UTF-8’%3F%3E%3Csvg width=‘1px’ height=‘1px’ viewBox=‘0 0 1 1’ version=‘1.1’ xmlns=‘http://www.w3.org/2000/svg’ xmlns:xlink=‘http://www.w3.org/1999/xlink’%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=‘none’ stroke-width=‘1’ fill=‘none’ fill-rule=‘evenodd’ fill-opacity=‘0’%3E%3Cg transform=‘translate(-249.000000, -126.000000)’ fill=‘%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

5、如何使用逻辑运算符组合模式:

使用逻辑运算符(例如OR“ ||”,“ &&&”)可以组合模式进行搜索。使用以下命令

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘$4>81 && $6>0.4 {print $2}’ linuxmi.txt
李华
方咪

![图片](data:image/svg+xml,%3C%3Fxml version=‘1.0’ encoding=‘UTF-8’%3F%3E%3Csvg width=‘1px’ height=‘1px’ viewBox=‘0 0 1 1’ version=‘1.1’ xmlns=‘http://www.w3.org/2000/svg’ xmlns:xlink=‘http://www.w3.org/1999/xlink’%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=‘none’ stroke-width=‘1’ fill=‘none’ fill-rule=‘evenodd’ fill-opacity=‘0’%3E%3Cg transform=‘translate(-249.000000, -126.000000)’ fill=‘%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

上面的命令将在第四个字段上打印大于81的人名,在第六个字段上打印大于0.4的人名。并且只有两个记录满足条件。

6、awk命令的特殊表达式:

有两个特殊表达式,“ BEGIN”和“ END”:

开始:在处理数据之前执行操作

结束:在处理完数据后执行一项操作

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘BEGIN {print “处理已经开始”}; {print $2}; END {print “处理已结束”}’ linuxmi.txt

![图片](data:image/svg+xml,%3C%3Fxml version=‘1.0’ encoding=‘UTF-8’%3F%3E%3Csvg width=‘1px’ height=‘1px’ viewBox=‘0 0 1 1’ version=‘1.1’ xmlns=‘http://www.w3.org/2000/svg’ xmlns:xlink=‘http://www.w3.org/1999/xlink’%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=‘none’ stroke-width=‘1’ fill=‘none’ fill-rule=‘evenodd’ fill-opacity=‘0’%3E%3Cg transform=‘translate(-249.000000, -126.000000)’ fill=‘%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

7、awk命令的有用的内置变量:

awk命令具有各种有助于数据处理的变量:

变量说明
NF它给出了数据中字段的数量
NR给出当前记录的编号
FILENAME显示当前正在处理的文件的名称
FS 和 OFS字段分隔符和输出字段分隔符
RS 和 ORS分离记录和输出记录分隔符

示例:

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘END{print "文件名是 ", FILENAME, “有”, NF, “个字段和”, NR, “个记录”}’ linuxmi.txt

我们使用“ END”,但是如果使用“ BEGIN”,则输出将给出0个字段和0个记录。

![图片](data:image/svg+xml,%3C%3Fxml version=‘1.0’ encoding=‘UTF-8’%3F%3E%3Csvg width=‘1px’ height=‘1px’ viewBox=‘0 0 1 1’ version=‘1.1’ xmlns=‘http://www.w3.org/2000/svg’ xmlns:xlink=‘http://www.w3.org/1999/xlink’%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=‘none’ stroke-width=‘1’ fill=‘none’ fill-rule=‘evenodd’ fill-opacity=‘0’%3E%3Cg transform=‘translate(-249.000000, -126.000000)’ fill=‘%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

8、如何更改记录分隔符:

记录中的默认分隔符通常为空格;如果有逗号“,”或点“。”作为字段分隔符,然后将“ FS”选项与分隔符一起使用。

我们再来看一个文件,其中的数据字段之间用逗号“:”隔开:

linuxmi@linuxmi:~/www.linuxmi.com$ cat linuxmi.txt
linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘BEGIN {FS=“:”}{print $2}’ linuxmi.txt

![图片](data:image/svg+xml,%3C%3Fxml version=‘1.0’ encoding=‘UTF-8’%3F%3E%3Csvg width=‘1px’ height=‘1px’ viewBox=‘0 0 1 1’ version=‘1.1’ xmlns=‘http://www.w3.org/2000/svg’ xmlns:xlink=‘http://www.w3.org/1999/xlink’%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=‘none’ stroke-width=‘1’ fill=‘none’ fill-rule=‘evenodd’ fill-opacity=‘0’%3E%3Cg transform=‘translate(-249.000000, -126.000000)’ fill=‘%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

由于文件的分隔符是冒号,但是“ awk”命令甚至对此类文件也很有用,因此只需使用“ FS”选项即可。

也可以使用“ -F”:

linuxmi@linuxmi:~/www.linuxmi.com$ awk -F “:” ‘{print $2}’ linuxmi.txt

默认记录分隔符为“换行符”,并将记录分隔符设置为“:”,请使用:

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘BEGIN{RS=“:”}{print $1}’ linuxmi.txt

![图片](data:image/svg+xml,%3C%3Fxml version=‘1.0’ encoding=‘UTF-8’%3F%3E%3Csvg width=‘1px’ height=‘1px’ viewBox=‘0 0 1 1’ version=‘1.1’ xmlns=‘http://www.w3.org/2000/svg’ xmlns:xlink=‘http://www.w3.org/1999/xlink’%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=‘none’ stroke-width=‘1’ fill=‘none’ fill-rule=‘evenodd’ fill-opacity=‘0’%3E%3Cg transform=‘translate(-249.000000, -126.000000)’ fill=‘%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

9、Awk Actions:

Awk Actions是由“{}”括号括起来的小程序,它有多个用分号“;”分隔的语句。

使用“ awk”命令最常用的语句是“ print”语句。例如,要打印每条记录的文本,请在引号中使用文本字符串:

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘{print “Linux迷 www.linuxmi.com,” $2}’ linuxmi.com.txt

图片

让我们使用awk执行简单的求和运算:

linuxmi@linuxmi:~/www.linuxmi.com$ awk ‘{sum += $4} END {printf “%d\n”, sum}’ linuxmi.com.txt

图片

10、创建awk程序:

让我们从“ awk”编程开始,下面给出的编程只是在做乘法:

### Linux迷 www.linuxmi.com ###
### Linux迷 www.linuxmi.com ###
### Linux迷 www.linuxmi.com ###
BEGIN {
i=2
while(j<4)
{
print “The multiplication of 2 with” j " is " i*j;
j++
}
}

![图片](data:image/svg+xml,%3C%3Fxml version=‘1.0’ encoding=‘UTF-8’%3F%3E%3Csvg width=‘1px’ height=‘1px’ viewBox=‘0 0 1 1’ version=‘1.1’ xmlns=‘http://www.w3.org/2000/svg’ xmlns:xlink=‘http://www.w3.org/1999/xlink’%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=‘none’ stroke-width=‘1’ fill=‘none’ fill-rule=‘evenodd’ fill-opacity=‘0’%3E%3Cg transform=‘translate(-249.000000, -126.000000)’ fill=‘%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

用“linuxmi.awk”的名称保存程序并运行,打开终端并输入:

linuxmi@linuxmi:~/www.linuxmi.com$ awk -f linuxmi.awk

![图片](data:image/svg+xml,%3C%3Fxml version=‘1.0’ encoding=‘UTF-8’%3F%3E%3Csvg width=‘1px’ height=‘1px’ viewBox=‘0 0 1 1’ version=‘1.1’ xmlns=‘http://www.w3.org/2000/svg’ xmlns:xlink=‘http://www.w3.org/1999/xlink’%3E%3Ctitle%3E%3C/title%3E%3Cg stroke=‘none’ stroke-width=‘1’ fill=‘none’ fill-rule=‘evenodd’ fill-opacity=‘0’%3E%3Cg transform=‘translate(-249.000000, -126.000000)’ fill=‘%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

总结:

“awk”命令是一种方便的命令,用于处理,扫描文本文件的数据,例如分隔文件的任何特定字段;我们使用“ awk”命令。它使从文本文件中以任何形式或模式搜索任何内容变得更加容易。在本指南中,我们了解“ awk”命令的基本知识及其用法。“ awk”命令可验证数据,生成报告,甚至解析文件。使用简单的命令“ awk”还可以使用户编写微型程序来更有效地处理数据。

**关注我们
**

长按或扫描下面的二维码关注Linux公社

图片

****关注Linux公社,添加“星标

每天获取技术干货,让我们一起成长

合作联系微信:linuxgs

var first_sceen__time = (+new Date()); if (“” == 1 && document.getElementById(‘js_content’)) { document.getElementById(‘js_content’).addEventListener(“selectstart”,function(e){ e.preventDefault(); }); }

预览时标签不可点

[阅读原文](javascript:😉

写留言

取消

留言

我的留言

[写留言](javascript:😉

正在加载

展开我的留言

留言被精选后将公开

精选留言

[写留言](javascript:😉

[写留言](javascript:😉

正在加载

全部留言

已无更多数据

[发消息](javascript:😉

关闭

写留言

提交更多

正在加载

[表情](javascript:😉

正在加载

留言

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-swWW7fsQ-1687269650170)(null)]

微信扫一扫
关注该公众号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值