如果你只使用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的函数(如计数行)可以更容易地由其他命令执行(如wc和wc - l),知道是什么仍然很有用awk能做些什么,尤其是当你开始写作的时候awk脚本和需要使用它的许多功能。