小编给大家分享一下Unix中awk命令怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
awk
命令不仅提供了简单的输入字符串筛选功能,还包含提取数据列、打印简单文本、筛选内容甚至做一些数学计算。
如果你仅使用 awk
选取一行中的特定文本,那么你可能错过了它的很多功能。在这篇文章中,我们会来看看使用 awk
可以帮你做一些其他的什么事情,并提供一些例子。
awk
所提供的最简单与最常用的功能便是从文件或管道传输的数据中选取特定的内容。默认使用空格当做分隔符,这非常简单。
$ echo one two three four five | awk ‘{print $4}’four$ who | awk ‘{print $1}’jdoefhenry
空格指的是一系列的 space
或 tab
字符。在下面所展示的命令里,awk
从提供的数据中筛选第一和第四项。
awk
命令也可以通过在其后增加文件名参数的方式从文本文件中获取数据。
$ awk '{print $1,$5,$NF}' HelenKellerQuoteThe beautiful heart.
(LCTT 译注:“The best and most beautiful things in the world can not be seen or even touched , they must be felt with heart.” ——海伦凯勒)
在这个例子中,awk
挑选了一行中的第一个、第五个和最后一个字段。
命令中的 $NF
指定选取每行的最后一个字段。这是因为 NF
代表一行中的字段数量,也就是 23,而 $NF
就代表着那个字段的值,也就是heart
。最后的句号也包含进去了,因为它是最后一个字符串的一部分。
字段能以任何有用的形式打印。在这个例子中,我们将字段以日期的格式进行打印输出。
$ date | awk '{print $4,$3,$2}'2019 Nov 22
如果你省略了 awk
命令中字段指示符之间的逗号,输出将会挤成一个字符串。
$ date | awk '{print $4 $3 $2}'2019Nov21
如果你将通常使用的逗号替换为连字符,awk
就会尝试将两个字段的值相减——或许这并不是你想要的。它不会将连字符插入到输出结果中。相反地,它对输出做了一些数学计算。
$ date | awk '{print $4-$3-$2}'1997
在这个例子中,它将年 “2019” 和日期 “22” 相减,并忽略了中间的 “Nov”。
如果你想要空格之外的字符作为输出分隔符,你可以通过 OFS
(输出分隔符)指定分隔符,就像这样:
$ date | awk '{OFS="-"; print $4,$3,$2}'2019-Nov-22
你也可以使用 awk
简单地显示一些文本。当然了,比起 awk
你可能更想使用 echo
命令。但换句话说,作为 awk
脚本的一部分,打印某些相关性文本将会非常实用。这里有一个没什么用的例子:
$ awk 'BEGIN {print "Hello, World" }'Hello, World
下面的例子更加合理,添加一行文本标签来更好的辨识数据。
$ who | awk 'BEGIN {print "Current logins:"} {print $1}'Current logins:shsnemo
不是所有的输入都以空格作为分隔符的。如果你的文本通过其它的字符作为分隔符(例如:逗号、冒号、分号),你可以通过 -F
选项(输入分隔符)告诉 awk
:
$ cat testfilea:b:c,d:e$ awk -F : '{print $2,$3}' testfileb c,d
下面是一个更加有用的例子——从冒号分隔的 /etc/passwd
文件中获取数据:
$ awk -F: '{print $1}' /etc/passwd | head -11rootdaemonbinsyssyncgamesmanlpmailnewsuucp
你也可以使用 awk
命令评估字段。例如你仅仅想列出 /etc/passwd
中的用户账号,就可以对第三个字段做一些筛选。下面的例子中我们只关注大于等于 1000 的 UID:
$ awk -F":" ' $3 >= 1000 ' /etc/passwdnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologinshs:x:1000:1000:Sandra Henry-Stocker,,,:/home/shs:/bin/bashnemo:x:1001:1001:Nemo,,,:/home/nemo:/usr/bin/zshdory:x:1002:1002:Dory,,,:/home/dory:/bin/bash...
如果你想为输出增加标题,可以添加 BEGIN
从句:
$ awk -F":" 'BEGIN {print "user accounts:"} $3 >= 1000 ' /etc/passwduser accounts:nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologinshs:x:1000:1000:Sandra Henry-Stocker,,,:/home/shs:/bin/bashnemo:x:1001:1001:Nemo,,,:/home/nemo:/usr/bin/zshdory:x:1002:1002:Dory,,,:/home/dory:/bin/bash
如果你想要不止一行的标题,你可以通过 "\n"
分隔输出:
$ awk -F":" 'BEGIN {print "user accounts\n============="} $3 >= 1000 ' /etc/passwduser accounts=============nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologinshs:x:1000:1000:Sandra Henry-Stocker,,,:/home/shs:/bin/bashnemo:x:1001:1001:Nemo,,,:/home/nemo:/usr/bin/zshdory:x:1002:1002:Dory,,,:/home/dory:/bin/bash
awk
提供了惊人的数学计算能力,并且可以开平方,算 log
,算 tan
等等。
这里有一对例子:
$ awk 'BEGIN {print sqrt(2019)}'44.9333$ awk 'BEGIN {print log(2019)}'7.61036
想要详细了解 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"}
注意 BEGIN
那一节是如何提供标题、指定字段分隔符和初始化计数器的,它仅在脚本初始化时期执行。这个脚本也包含 END
节,它仅在中间所有命令处理完成之后运行,显示了所有中间小节所筛选数据的最终行数(第三个字段大于等于 1000)。
以上是“Unix中awk命令怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。