0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文详解Linux awk命令

CHANBAEK 来源:myfreax 作者:myfreax 2022-12-07 17:34 次阅读

Awk是一种通用脚本语言,用于高级文本处理的。它主要用作报告和分析工具。与大多数其他程序性编程语言不同。

Awk是数据驱动的,这意味着您必须定义一组针对输入文本要执行的操作。它获取输入数据,对其进行转换,然后将结果发送到标准输出。

awk有几种不同的实现。我们将使用Awk的GNU实现,称为gawk。在大多数Linux发行版可用,awk命令只gawk的符号链接。

在本教程的所有示例中,我们将使用teams.txt文件作为awk的输入,teams.txt文件内容如下所示。

Bucks Milwaukee    60 22 0.732 
Raptors Toronto    58 24 0.707 
76ers Philadelphia 51 31 0.622
Celtics Boston     49 33 0.598
Pacers Indiana     48 34 0.585

teams.txt

记录和字段

Awk可以处理文本数据和流。将输入的数据分为记录和字段。Awk一次对一条记录进行操作,直到达到输入结束为止。

记录由记录分隔符分隔。默认的记录分隔符是换行符,这意味着文本数据中的每一行都是一条记录。可以使用RS变量来设置记录分的隔符。

记录由多个字段组成,并且使用字段分隔符分隔。默认情况下,字段之间用空格分隔,可以是一个或多个制表符,空格等,你可以使用awk命令的-F选项指定字段的分隔符。

每条记录中的字段都可以使用美元符号$后跟字段编号表示,从1开始。第一个字段由$1表示,第二个字段由$2表示。

依此类推,最后一个字段也可以用特殊变量$NF表示。整个记录可以用$0表示。

下面可以直观展示记录和字段的关系,也是awk处理文本数据默认使用的记录分隔符,即换行符。字段分隔符是空格符。

tmpfs      788M  1.8M  786M   1% /run/lock 
/dev/sda1  234G  191G   31G  87% /
|-------|  |--|  |--|   |--| |-| |--------| 
   $1       $2    $3     $4   $5  $6 ($NF) --> 字段 $1,$2...字段
|-----------------------------------------| 
                    $0                     --> 记录由多个字段组成的单行记录

正则表达式模式

正则表达式是与一组字符串匹配的模式。Awk正则表达式模式包含在斜杠//中。这是正则表达式模式语法形式/regex pattern/ { action }

模式可以是任何类型的扩展正则表达式,换句话说,你在其它语言使用的正则表达式都可以用于awk。

例如命令awk '/0.5/ { print $1 }' teams.txt仅打印包含0.5记录的第一个字段。

命令awk '/^[0-9][0-9]/ { print $1 }' teams.txt将会搜索以两个或多个数字开头的记录,并打印第一个字段。

awk '/0.5/ { print $1 }' teams.txt
Celtics
Pacers
awk '/^[0-9][0-9]/ { print $1 }' teams.txt
76ers

关系表达模式

关系表达式模式通常用于匹配指定字段或变量的内容。默认情况下,正则表达式模式与记录进行匹配。

要将正则表达式与字段进行匹配,请指定字段并针对模式使用包含比较运算符约等于号~。要匹配不包含指定模式的字段,请使用不约等于运算符!~

除了约等于和不約等于符号之外,您可以比较字符串或数字之间的关系,例如大于>,小于<,等于=符号。

例如命令awk '$2 ~ /ia/ { print $1 }' teams.txt将会搜索第二个字段包含ia的记录并打印第一个字段。

awk '$2 ~ /ia/ { print $1 }' teams.txt
76ers
Pacers

例如命令awk '$2 !~ /ia/ { print $1 }' teams.txt将会搜索第二个字段不包含ia的记录并打印第一个字段。

awk '$2 !~ /ia/ { print $1 }' teams.txt
Bucks
Raptors
Celtics

例如命令awk '$3 > 50 { print $1 }' teams.txt将会搜索三字段大于50的所有记录,并打印第一字段。

awk '$3 > 50 { print $1 }' teams.txt
Bucks
Raptors
76ers

范围模式

范围模式由用逗号分隔的两个模式组成,从匹配第一个模式的记录开始,直到匹配第二个模式的记录停止匹配。

也就是说匹配两个模式之间的记录都会被执行相关的操作。即使中间记录没有匹配模式也将会被执行相关操作。

但有一点值得注意的是范围模式不能与某些模式表达式组合使用。但范围模式可以与关系表达式组合使用。

例如命令awk '/Raptors/,/Celtics/ { print $1 }' teams.txt将会搜索从包含Raptors的记录开始到包含Celtics记录结束的所有记录。

然后打印两个模式之间所有记录的第一个字段{ print $1 }

awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
Raptors
76ers //这个记录没有匹配到两个模式中任意一个,但它在两个模式之间,所以也会打印
Celtics

例如命令awk '$4 == 31, $4 == 33 { print $0 }' teams.txt组合范围模式和关系表达式。

将会搜索第四个字段等于31记录开始,直到第四个字段等于33的所有记录。然后打印整个记录$0

awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622
Celtics Boston     49 33 0.598

特殊表达模式

Awk可以使用的特殊模式是。BEGIN用于在处理记录之前执行的操作。END用于在处理记录后执行操作。

BEGIN模式通常用于声明变量,END模式通常用于处理记录中的数据,例如统计指定字段的总数。

如果程序只有BEGIN模式,则执行操作,并且不处理输入数据。如果程序只有END模式,则在执行操作之前先处理输入。

awk的Gnu版本还包含另外两个特殊模式BEGINFILEENDFILE,它们允许您在处理文件时执行操作。

在下面的示例中将打印Start Processing.,然后打印每个记录的第三个字段,最后打印End Processing.。这是一个简单的示例,你也可以用于打印字段的名称。

awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing
60
58
51
49
48
End Processing.

组合模式

Awk允许您使用逻辑AND运算符&&和逻辑或运算符||组合两个或多个模式。

例如命令awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt使用&&运算符搜索第三字段大于50而第四字段小于30的记录,然后打印已匹配记录的第一个字段。

awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
Bucks
Raptors
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206734
  • 命令
    +关注

    关注

    5

    文章

    638

    浏览量

    21849
  • 脚本语言
    +关注

    关注

    0

    文章

    47

    浏览量

    8113
收藏 人收藏

    评论

    相关推荐

    Linux Awk命令实例教程

    Awk是一种通用脚本语言,用于高级文本处理的。它主要用作报告和分析工具。与大多数其他程序性编程语言不同。
    发表于 12-08 16:32 374次阅读

    Linux中grep、sed和awk命令详解

    今天给大家聊一聊Linux中文本操作的`三剑客:awk、grep、sed`,因其功能强大、使用频繁,且是Linux下文本处理的得力利器,常被称之为`文本三剑客`。`grep`常用于查找,`sed`常用于取行和替换,而`
    发表于 04-26 17:20 1934次阅读
    <b class='flag-5'>Linux</b>中grep、sed和<b class='flag-5'>awk</b><b class='flag-5'>命令</b><b class='flag-5'>详解</b>

    Linux系统命令及其使用详解

    Linux系统命令及其使用详解
    发表于 08-20 13:38

    Linux的chattr与lsattr命令详解

    【转】Linux的chattr与lsattr命令详解
    发表于 04-20 11:38

    Linux关机命令详解

    Linux关机命令详解linux下一些常用的关机/重启命令有shutdown、halt、reboot、及init,它们都 可以达到重启
    发表于 01-18 12:52 3515次阅读

    Linux系统命令及其使用详解 _120页

    电子发烧友网站提供《Linux系统命令及其使用详解 _120页.doc》资料免费下载
    发表于 04-18 13:23 3次下载

    Linux命令详解 [兼容模式]pdf免费下载

    linux命令详解pdf,希望对大家有帮助!
    发表于 12-15 15:54 10次下载

    Linux Awk用法总结

    Awk、sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以匹配文本,其中sed和awk还可以用于文本编辑,而grep则不具备这个功用。
    的头像 发表于 04-13 09:27 5374次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>Awk</b>用法总结

    linuxawk以及重定向命令如何使用?

    awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作,完整的awk脚本通常用来格式化文本文件中的信息
    发表于 10-18 17:25 3次下载

    Linuxawk命令的格式和匹配模式

    1.命令简介 AWK 是文本处理语言,是一个强大的文本分析工具,是 Unix/Linux 环境中功能强大的数据处理引擎之一。数据可以来自标准输入(stdin)、一个或多个文件或其它命令
    的头像 发表于 03-11 16:24 3731次阅读

    Linux三剑客之awk实战详解教程

    awk 强大的功能,是一般 Linux 命令无法比拟的。在本文中,我不会告诉你 awk 也是一种编程语言,免得会吓到你。我们只需把它当做 Linux
    的头像 发表于 03-31 17:12 1950次阅读
    <b class='flag-5'>Linux</b>三剑客之<b class='flag-5'>awk</b>实战<b class='flag-5'>详解</b>教程

    Linux系统中EXP命令详解质量汇总

    Linux系统中EXP命令详解质量汇总
    发表于 05-14 09:35 1次下载

    Linux虚拟机之tcpdump命令操作详解

    Linux虚拟机之tcpdump命令操作详解
    发表于 08-12 09:50 23次下载

    Linux cat命令详解

    `cat`命令Linux中最常用的命令之一,`cat`命令的名称来自于con**cat**enate。它可以读取和连接文件,并将其内容写入到标准输出。
    的头像 发表于 12-14 17:24 9079次阅读

    关于linuxawk高效命令集锦

    今天浩道跟大家分享关于linux三剑客之一的awk相关的高效命令集锦!
    发表于 04-20 10:09 216次阅读