当前位置: 首页 > 科技观察

带你了解awk命令

时间:2023-03-17 17:47:14 科技观察

awk不仅提供简单的输入字符串过滤功能,还包括提取数据列、打印简单文本、过滤内容——甚至做一些数学计算。如果您只是使用awk选择一行中的特定文本,您可能会错过它的很多功能。在本文中,我们将了解您还可以使用awk做什么并提供一些示例。提取数据列awk提供的最简单和最常用的功能是从文件或管道数据中提取特定内容。默认情况下使用空格作为分隔符,这很简单。$echo一二三四五|awk'{print$4}'四$谁|awk'{print$1}'jdoefhenry空格指的是一系列空格或制表符。在下面显示的命令中,awk从提供的数据中过滤第一项和第四项。awk命令还可以通过在文本文件后添加文件名参数来从文本文件中获取数据。$awk'{print$1,$5,$NF}'引用海伦凯勒美丽的心。Keller)在此示例中,awk选取一行中的第一个、第五个和最后一个字段。命令中的$NF指定选择每行的最后一个字段。这是因为NF代表一行中的Field个数,也就是23,而$NF代表那个字段的值,也就是heart。最后一个句点也包括在内,因为它是最后一个字符串的一部分。字段可以以任何有用的形式打印。在此示例中,我们将字段打印为日期。$日期|awk'{print$4,$3,$2}'2019Nov22如果在awk命令中省略字段指示符之间的逗号,输出将被压缩为一个字符串。$日期|awk'{print$4$3$2}'2019Nov21如果你用连字符替换通常的逗号,awk会尝试减去两个字段的值——也许不是你想要的。它不会在输出中插入连字符。相反,它对输出进行一些数学计算。$日期|awk'{print$4-$3-$2}'1997在此示例中,它从日期“22”中减去年份“2019”并忽略中间的“Nov”。如果你想用空格以外的字符作为输出分隔符,你可以通过OFS(输出字段分隔符)来指定分隔符,像这样:awk'{OFS="-";print$4,$3,$2}'2019-Nov-22printsimpletext您还可以使用awk来简单地显示一些文本。当然,您可能希望使用echo命令而不是awk。但换句话说,打印一些依赖文本作为awk脚本的一部分会很有用。下面是一个无用的例子:$awk'BEGIN{print"Hello,World"}'Hello,World下面的例子更有意义,添加一行文本标签可以更好地识别数据。$谁|awk'BEGIN{print"Currentlogins:"}{print$1}'Currentlogins:shsnemo指定字段分隔符并非所有输入都用空格分隔。如果您的文本使用其他字符作为分隔符(例如:逗号、冒号、分号),您可以通过-F选项(输入分隔符)告诉awk:$cattestfilea:b:c,d:e$awk-F:'{print$2,$3}'testfilebc,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:SandraHenry-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“用户帐户:”}$3>=1000'/etc/passwduseraccounts:nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologinshs:x:1000:1000:SandraHenry-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"useraccounts\n============"}$3>=1000'/etc/passwduseraccounts==============nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologinshs:x:1000:1000:桑德拉·亨利-斯托克,,,:/home/shs:/bin/bashnemo:x:1001:1001:海底总动员,,,:/home/nemo:/usr/bin/zshdory:x:1002:1002:Dory,,,:/home/dory:/bin/bash在awk中进行数学计算awk提供了惊人的数学计算能力,可以开平方,计算log,计算tan等。下面是一对例子:$awk'BEGIN{printsqrt(2019)}'44.9333$awk'BEGIN{printlog(2019)}'7.61036想了解更多awk的数学计算能力,可以看这篇文章《使用 awk 进行数学计算》.awk脚本您还可以使用awk编写一组独立的脚本。下面的例子模仿了我之前写的那个,但是也统计了系统中的账户数。#!/usr/bin/awk-f#这一行是注释BEGIN{printf"%s\n","Useraccounts:"print"=============="FS=":"n=0}#现在开始遍历数据{if($3>=1000){print$1n++}}END{print"=============="printn"accounts"}请注意BEGIN部??分如何提供标头、指定字段分隔符和初始化计数器,这些仅在脚本初始化期间执行。此脚本还包含一个END部分,仅在所有中间命令都已处理后运行,显示所有中间部分过滤数据的最终行数(第三个字段大于或等于1000)。作为Unix上的一个历史悠久的命令,awk仍然提供了非常有用的服务,这也是我几十年前爱上Unix的原因之一。