awk的许多面

awk命令提供的不仅仅是从输入字符串中选择字段,还包括提取数据列、打印简单文本、评估内容——甚至进行数学计算。

丰富多彩的多层次多元文化的面孔
思想库

如果你只使用awk当您需要从文本行中选择特定字段时,您可能会错过该命令可以提供的许多其他服务。在这篇文章中,我们将看看这个简单的用法以及其他许多东西awk可以为您提供足够的示例,向您展示该命令比您想象的要灵活得多。

取出数据列

最简单和最常用的服务awk提供是从文件或通过管道传送到它的数据中选择特定字段。默认使用空格作为字段分隔符,这非常简单:

$ echo 1 2 3 4 5 | awk '{print $4}'

4 $ who | awk '{print $1}' jdoe fhenry

空白是任何空格和制表符的序列。在上面的命令中,awk只是从提供的数据中提取第四个和第一个字段。

[通过注册《网络世界通讯》获得定期的见解。]足球竞猜app软件

Awk还可以从文件中提取文本,只需要在awk命令。

$ awk '{print $1,$5,$NF}' HelenKellerQuote美丽的心。

在这种情况下,awk在单行文本中选出了第一个、第五个和最后一个单词。

NF美元命令中的规范选择每行上的最后一段文本。这是因为NF表示一行中的字段数(23)NF美元代表了价值最后一个领域(“心”)。句点包含在输出中,因为它是最后一个字符串的一部分。

字段可以按您认为有用的任何顺序打印。在这个例子中,我们重新排列字段日期命令的输出。

$ date | awk '{print $4,$3,$2}' 2019年11月22日

如果省略字段指示符之间的逗号awk命令时,输出将被推入单个字符串。

$ date | awk '{print $4 $3 $2}

如果你用连字符替换普通的逗号,awk尝试从一个字段中减去另一个字段——可能不是你想要的。它不会将连字符作为插入打印输出的字符。相反,它发挥了自己的数学才能。

$ date | awk '{print $4-$3-$2}' 2019

在这种情况下,它是从一年(2021)中减去2(当月的某一天),并简单地忽略“Aug”。

如果您希望输出由空白以外的东西分隔,您可以指定输出分隔符OFS(输出字段分隔符)如下:

$ date | awk '{OFS="-";印刷4美元,3美元,$ 2}’2021 - 8月- 02

如果你的日期命令输出如下所示,需要将字段更改为7美元,2、3美元在上面显示的命令中,年份是最后列出的。

$ date 8月2日星期一美国东部时间2021年下午02:26:34

印刷简单的文本

你也可以用awk简单地显示一些文本。当然,如果您只想打印一行文本,那么最好使用回声命令。另一方面,作为awk脚本,打印一些相关的文本是非常有用的。这里有一个毫无用处的例子:

$ awk 'BEGIN {print "Hello, World"}' Hello, World .

这里有一个更合理的例子,添加一行文本来标记你的数据,可以帮助你识别你正在看的是什么:

$ who | awk 'BEGIN {print "当前登录名:"}{print $1}'当前登录名:shs nemo . sh

指定字段分隔符

并不是所有的输入都用空格隔开。如果你的文本被其他字符(例如,逗号,冒号或分号)分隔,你可以告知awk通过使用- f(输入分隔符)选项如下所示:

$ cat testfile a:b:c,d:e $ awk -F: '{print $2,$3}' testfile b c,d:e

下面是一个更有用的示例——从冒号分隔的字段中提取字段/ etc / passwd文件:

$ awk -F: '{print $1}' /etc/passwd | head -11 root bin daemon adm lp sync shutdown halt mail operator games

评估的内容

您还可以使用awk.例如,如果您只想列出用户帐户/ etc / passwd,则可以包含对第三个字段的测试。在这里,我们只追求大于或等于1000的uid:

/etc/passwd nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin shs:x:1000:1000:Sandra Henry-Stocker…:/home欧洲杯男足/shs:/bin/bash nemo:x:1001:1001: nemo…

如果您想为您的清单添加标题,您可以添加开始条款:

awk - f”:“美元”开始{打印“用户帐户:“}$ 3 > = 1000 / etc / passwd用户帐户:没有人:x: 65534:65534:没有人:/不存在:/ usr / sbin / nologin啦! x: 1000:1000:桑德拉Henry-Stocker…:/ home /合成:/ bin 欧洲杯男足/ bash nemo: x: 1001:1001:尼莫…:/ home /尼莫:/ usr / bin / zsh海鲂:x: 1002:1002:海鲂…:/ home /海鲂:/ bin / bash

如果你想在标题中包含不止一行,你可以用“\n”(换行符)分隔你想要的输出行。

awk美元- f”:“\ n”开始{打印用户帐户 ============="} $ 3 > = 1000 / etc / passwd用户帐户  ============= 没有人:x: 65534:65534:内核溢出用户:/:/ sbin / nologin啦! x: 1000:1000:桑德拉Henry-Stocker: / home /合成:/ bin / b欧洲杯男足ash nemo: x: 1001:1001:: / home /尼莫:/ bin / bash bugfarm: x: 1006:1006:: / home / bugfarm: / bin / bashdbell: x: 1002:1002:: / home / dbell: / bin / bash多萝西:x: 1008:1008:: / home /多萝西:/ bin / bash鳗鱼:x: 1005:1005:: / home /鳗鱼:/ bin / bash gijoe: x: 1017:1017:: / home / gijoe: / bin / bash基诺:x: 1016:1016:: / home /基诺:/ bin / bash洛拉:x: 1007:1007:: / home /洛拉:/ bin / bash自己:x: 1013:1013:: / home /自己:/ bin / bash分类列出:x: 1014:1014:: / home /分类列出:/ bin / bashShark:x:1003:1003::/home/ Shark:/bin/bash tadpole:x:1004:1004::/home/tadpole:/bin/bash jadep:x:1012:1012::/home/jadep:/bin/bash snakey:x:1018:1018::/home/snakey:/bin/bash monsterfromthedeepbluesea:x:1019:1019::/home/monsterfromthedeepbluesea:/bin/bash

用awk做数学

awk提供惊人的数学能力,可以计算平方根,对数,切线等。

下面是一些例子:

$ awk 'BEGIN {print sqrt(2021)}'
$ awk 'BEGIN {print log(2019)}

有关awk他的数学技能,看看吧用awk做数学

编写awk脚本

您还可以使用awk.下面的示例模拟了前面提供的一个示例,但也计算了系统上拥有帐户的用户数量。

#!/usr/bin/awk -f #这一行是一个注释BEGIN {printf "%s\n","User accounts:" print "==============" FS=":" n=0} #现在我们将运行数据{if ($3 >= 1000) {print $1 n ++}} END {
Print "==============" Print n " accounts"}

注意,开始节,只在脚本开始时运行,它提供一个标题,指定字段分隔符,并设置以0开始的计数器。该脚本还包括结束段,它只在提供给脚本的文本中的所有行都被处理之后运行。它在中间部分显示符合规范的最终行数(第三个字段为1,000或更大)。

像这样使用脚本:

$ ./list_users /etc/passwd用户账号:============== nobody shs nemo bugfarm bell dorothy eel gijoe gino lola myself newuser shark tadpole jadep snake monsterfromthedeepbluesea ============== 17账号

在文件中搜索文本

您可以使用awk从包含指定字或字符串的文件中选择行。下面的例子演示了这两种情况,在第三种情况中允许使用小写或大写的“B”。

Happy_Quotes“幸福就是你所想、所说和所做的和谐统一。”-圣雄甘地
“现在的时刻充满了快乐和幸福。只要你留心,你就会看见的。”释一行
$ awk '/[Bb]e happy/ {print}' Happy_Quotes "为这一刻感到快乐。这一刻就是你的生命。”——奥玛开阳

选择文件的一部分

要从文件中选择文本部分,需要包含标识要提取的部分的起始行和结束行中的文本。这里有一个例子:

行动不一定带来幸福,但没有行动就没有幸福。——威廉·詹姆斯

替换文件中的文本

更改文件中使用的文本awk,您可以使用如下所示的语法。请记住,这会更改您看到的文本,但不会修改文件内容。要保存更改,请将输出重定向到一个临时文件,然后使用它来替换原始文件。

$ awk ' {gsub(/快乐/,“恐惧”);“此刻充满了恐惧和快乐。只要你留心,你就会看见的。”释一行

若要替换多个字符串,请使用多个字符串gsub命令:

$ awk ' {gsub(/快乐/,“恐惧”);gsub(/幸福/,“痛苦”);“此刻充满了恐惧和痛苦。只要你留心,你就会看见的。”释一行

数文件中的行或字

使用。打印文件中的行数awk这样做:

$ awk 'END {print NR}' Happy_Quotes

的包容结束在该命令中,表示在处理行之后提供输出。NR(记录的数量)表示文件中的行数。

要打印文件每行的字数(或字符串),可以使用如下命令:

$ awk '{print NF}' Happy_Quotes 18 15 12 16 11 12 17 18 20 2 15 2

您可以使用如下所示的脚本数单词并提供总数。

$ cat count_words #!/usr/bin/awk -f BEGIN {num=0} {print NF num=num + NF} END {print num}

这个脚本在目标文件中逐行运行,并将每行的单词计数添加到总数中。这工作,因为NF表示每行中的字段数。

或者,你可以用awk像这样的命令,以获得整体和每行加上整体计数:

$ awk 'BEGIN {num=0};{num = num + NF};END {print num}' Happy_Quotes 158 $ awk 'BEGIN {num=0};{打印NF; num = num + NF};END {print num}' Happy_Quotes 18 15 12 16 11 12 17 18 20 2 15 2 158
$ count_words Happy_Quotes

确定使用最频繁的命令

你也可以用awk以及其他一些命令,以查看在当前历史文件的生命周期内使用最频繁的命令。

$ history | awk '{print $2}' | sort | uniq -c | sort -nr | head -5 191 sudo 91 ls 80 vi 57 systemctl 51 man .

如果您已经在历史文件中添加了日期和时间字段,请使用$4而不是$2在上面的命令中。

总结

一个长期存在的Unix命令,awk仍然提供非常有用的服务,这也是我几十年前爱上Unix的原因之一。虽然有些awk的函数(如计数行)可以更容易地由其他命令执行(如wcwc - l),知道是什么仍然很有用awk能做些什么,尤其是当你开始写作的时候awk脚本和需要使用它的许多功能。

加入网络世界社区足球竞猜app软件脸谱网LinkedIn对自己最关心的话题发表评论。
相关:

版权©2021足球竞彩网下载

SD-WAN买家指南:向供应商(和您自己)提出的关键问题