如果你只使用awk当您需要从文本行中选择特定字段时,您可能会错过该命令可以提供的许多其他服务。在这篇文章中,我们将看看这个简单的用法以及其他许多东西awk可以为您提供足够的例子来向您展示命令比您想象的更灵活。
拔出数据列
最简单和最常用的服务awk提供是从文件或通过管道传送到它的数据中选择特定字段。默认使用空格作为字段分隔符,这非常简单:
4 $ who | awk '{print $1}' jdoe fhenry
空白是任何空格和制表符的序列。在上面的命令中,awk只是从提供的数据中提取第四个和第一个字段。
[通过注册《网络世界通讯》获得定期的见解。]有个足球雷竞技app
Awk还可以通过在邮件后添加文件的名称来从文件中提取文本awk命令。
$ awk '{print $1,$5,$NF}' HelenKellerQuote美丽的心。
在这种情况下,awk已经在单行文本中挑出了第一个,第五个和最后一句话。
这NF美元命令中的规范选择每行上的最后一段文本。这是因为NF表示行中的字段数(23)NF美元代表了价值最后的领域(“心脏”)。该句点包含在输出中,因为它是最终字符串的一部分。
字段可以按您认为有用的任何顺序打印。在这个例子中,我们重新排列字段日期命令的输出。
$日期|AWK'{打印4美元,3美元,2美元}'2019年11月22日
如果省略字段指示符之间的逗号awk命令,输出将被推入单个字符串。
$ date | awk '{print $4 $3 $2}
如果你用连字符替换普通的逗号,awk尝试从一个字段中减去另一个字段——可能不是你想要的。它不会将连字符作为插入打印输出的字符。相反,它发挥了自己的数学才能。
$ date | awk '{print $4-$3-$2}' 2019
在这种情况下,它从一年(2021年)减去了2个(月的日期),并且只需忽略“八月”。
如果您希望输出由空白以外的东西分隔,您可以指定输出分隔符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 |头-11根箱守护进程ADM LP Sync Shutdown Halt Mail操作员游戏
评估的内容
您还可以使用awk.例如,如果您只想列出用户帐户在/ etc / passwd,则可以包含对第三个字段的测试。在这里,我们只追求大于或等于1000的uid:
$ awk-f“:”3美元> = 1000'/ etc / passwd noboder:x:65534:65534:没有人:/ usr / sbin / nologin shs:x:1000:1000:sandra henry雷竞技投注下载-oper:sandra henry-optor ,,,:/ home / shs:/ bin / bash nemo:x:1001:1001:nemo ,,:/ home / nemo:/ usr / bin / zsh dory:x:1002:1002:dory ,,,:/ home/ dory:/ bin / bash ...
如果要为您的列表添加标题,则可以添加一个开始条款:
$ awk-f“:”'开始{print“用户帐户:”} $ 3> = 1000“/ etc / passwd用户帐户:nobody:x:65534:65534:nobody:/ nonehistent:/ usr / sbin / nologin shs:X:1000:1000:雷竞技投注下载Sandra Henry-Stocker ,,:/ Home / SHS:/ Bin / Bash Nemo:X:1001:1001:Nemo ,,:/ Home / Nemo:/ USR / Bin / Zsh Dory:X:1002:1002:Dory ,,:/ home / Dory:/ 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)}'
44.9555 $ awk'开始{print log(2019)}'7.61036
有关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 {
打印“==============”打印n“帐户”}
注意这件事怎么样开始节,只在脚本开始时运行,它提供一个标题,指定字段分隔符,并设置以0开始的计数器。该脚本还包括结尾段,它只在提供给脚本的文本中的所有行都被处理之后运行。它在中间部分显示符合规范的最终行数(第三个字段为1,000或更大)。
使用这样的脚本:
$ ./list_users / etc / passwd用户帐户:==============没有人shs nemo bugfarm dbell dorothy eel gijoe gino lola mison newuser shark tadpole jadep snakey monsterfromthedeepbluesea ============== 17账户
在文件中搜索文本
您可以使用awk从包含指定字或字符串的文件中选择行。下面的例子演示了这两种情况,在第三种情况中允许使用小写或大写的“B”。
$ awk'/ harmony / {print}'happy_quotes“幸福就是你的想法,你所说的,你所做的事情和谐。”-mahatma gandhi $ awk'/现在的时刻/ {print}'happy_quotes
“现在的时刻充满了快乐和幸福。只要你留心,你就会看见的。”- 那纳哈特汉语
$ awk '/[Bb]e happy/ {print}' Happy_Quotes "为这一刻感到快乐。这一刻就是你的生命。”——奥玛开阳
选择文件的一部分
要从文件中选择文本部分,需要包含标识要提取的部分的起始行和结束行中的文本。这里有一个例子:
行动不一定带来幸福,但没有行动就没有幸福。——威廉·詹姆斯
替换文件中的文本
更改文件中使用的文本awk,您可以使用如下所示的语法。请记住,这更改了您所看到的文本,但不会修改文件内容。要保存更改,将输出重定向到临时文件,然后使用它来替换原件。
$ awk ' {gsub(/快乐/,“恐惧”);“此刻充满了恐惧和快乐。只要你留心,你就会看见的。”- 那纳哈特汉语
要替换多个字符串,请使用多个字符串GSUB.命令:
$ awk ' {gsub(/快乐/,“恐惧”);GSUB(/幸福/,“苦难”);打印}'test11“目前的时刻充满了恐惧和痛苦。如果你殷勤,你会看到它。”- 那纳哈特汉语
数文件中的行或字
使用。打印文件中的行数awk这样做:
$ awk'结束{print nr}'happy_quotes 12
的包容结尾在该命令中,表示在处理行之后提供输出。NR(记录的数量)表示文件中的行数。
要打印文件每行的字数(或字符串),可以使用如下命令:
$ awk'{print nf}'happy_quotes 18 15 12 16 11 12 17 17 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'开始{num = 0};{num = num + nf};结束{print num}'happy_quotes 158 $ awk'开始{num = 0};{print nf; num = num + nf};结束{Print Num}'Happy_quotes 18 15 12 16 11 12 1718 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函数(如计数线)可以通过其他命令更容易地执行(如wc和wc - l),知道是什么仍然很有用awk可以做,特别是如果你写作awk脚本和需要使用它的许多功能。