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

awk命令的用法你知道多少?_0

时间:2023-03-14 15:55:12 科技观察

awk命令提供的不仅仅是从输入字符串中选择字段,还可以提取数据列、打印简单文本、评估内容——甚至进行数学运算。如果您只在需要从一行文本中选择特定字段时使用awk,您可能会错过该命令可以提供的许多其他用途。在本文中,我们将了解这个简单的用法以及awk还能为您做些什么,并通过足够的示例向您展示该命令比您想象的要灵活得多。提取数据列awk提供的最简单的用途是从文件或通过管道传输到文件中的数据中选择特定字段。默认情况下,空格用作字段分隔符:[root@localhost~]#echoonetwothree4five|awk'{print$4}'四[root@localhost~]#谁|awk'{print$1}'rootroot显示在命令上方,awk仅从提供的数据中提取第四个字段和第一个字段。awk还可以通过将文件名附加到awk命令来从文件中提取文本。[root@localhost~]#awk-F':''{print"user:"$1,"home:"$6,"shell:"$NF}'/etc/passwd这种情况下awk使用-F':'选项指定冒号作为分隔符。选择文本中的第一列、第六列和最后一列。命令中的$NF选择最后一个字段。这是因为NF表示一行中的字段数,而$NF表示最后一个字段的值。可以按照您认为有用的任何顺序打印字段。在此示例中,我们重新排列date命令输出中的字段。[root@localhost~]#日期|awk'{print"Date:",$6,$2,$3}'Date:2021Sep26如果希望输出用其他符号分隔,可以使用OFS(OutputFieldSeparationcharacter)指定输出分隔符如下:[root@localhost~]#日期|awk'{OFS="-";print$6,$2,$3}'2021-Sep-26Evaluatecontent您还可以使用awk来评估字段。例如,如果只想列出/etc/passwd文件中UID大于1000的用户信息:[root@localhost~]#awk-F':''$3>=1000'/etc/passwdnobody:x:65534:65534:内核溢出用户:/:/sbin/nologinuser01:x:1000:1000::/home/user01:/bin/bashtest01:x:1001:1001::/home/test01:/bin/bashnatasha:x:1002:1002::/home/natasha:/bin/bash如果要向列表添加标题,可以添加BEGIN子句。如果要在标题中多行,可以使用\n换行符:[root@localhost~]#awk-F':''BEGIN{print"useraccounts\n==============="}$3>=1000'/etc/passwduseraccounts===============nobody:x:65534:65534:KernelOverflowUser:/:/sbin/nologinuser01:x:1000:1000::/home/user01:/bin/bashtest01:x:1001:1001::/home/test01:/bin/bashnatasha:x:1002:1002::/home/natasha:/bin/bash使用awk做数学计算awk提供算术能力,可以计算平方根、对数、正切等[root@localhost~]#awk'BEGIN{printsqrt(2021)}'44.9555[root@localhost~]#awk'BEGIN{printlog(2019)}'7.61036编写awk脚本您还可以使用awk编写独立脚本。下面是一个模仿前面提供的示例之一的示例,但也计算在系统上拥有帐户的用户数。[root@localhost~]#vimlist_users#!/usr/bin/awk-f#这一行是注释BEGIN{printf"%s\n","用户账户:"print"==============="FS=":"n=0}#现在我们将遍历数据{if($3>=1000){print$1n++}}END{print"=============="printn"accounts"}请注意,仅在脚本启动时运行的BEGIN部??分提供标题,指示字段分隔符,并设置从0开始的计数器。该脚本还包括一个END部分,仅在脚本末尾运行。[root@localhost~]#./list_users/etc/passwdUseraccounts:===============nobodysystemd-coredumpsystemd-resolvepolkitdssdchronyunbounduser01test01natasha================10accounts统计一个文件的行数要用awk打印一个文件的行数:[root@localhost~]#awk'END{printNR}'在/etc/passwd26命令中包含END表示之后提供处理行输出。NR(NumberofRecords)表示文件中的行数。获取最常用的命令您还可以将awk与许多其他命令一起使用,以查看当前历史文件中最常用的命令。[root@localhost~]#历史|awk'{print$2}'|sort|uniq-c|sort-nr|head-558lvs48ll31vim29vgs29df