我有这个awk命令:
echo www.host.com |awk -F. '{$1="";OFS="." ; print $0}' | sed 's/^.//'
这是从主机名中获取域:
host.com
该命令在CentOS 7(awk v 4.0.2)上有效,但在ubuntu 19.04(awk 4.2.1)或alpine(gawk 5.0.1)上无效,输出是:
host com
我如何修复该awk表达式,使其在最新的awk版本中起作用?
对于您提供的样品,请尝试以下。这将尝试从第一个.
到行的最后匹配正则表达式,然后在第一个点到行的最后打印。
echo www.host.com | awk 'match($0,/\..*/){print substr($0,RSTART+1,RLENGTH-1)}'
[OP的代码修复:]如果OP想要使用他/她自己的经过尝试的代码,则可以使用以下帮助。这里有2点:1-我们不需要与awk
一起使用任何其他命令来进行处理。 2-我们需要在每一行中都在FS
部分中设置OFS
和BEGIN
的值。
echo www.host.com | awk 'BEGIN{FS=OFS="."} {$1="";sub(/\./,"");print}'
您在awk上有2个很好的答案,但我认为应该用cut
处理,因为它很简单,它可以使所有字段开始到一个已知位置:
echo 'www.host.com' | cut -d. -f2-
host.com
使用的选项是:
-d.
:将定界符设置为.
-f2-
:提取从位置2开始的所有字段要获取域,请使用:
$ echo www.host.com | awk 'BEGIN{FS=OFS="."}{print $(NF-1),$NF}'
host.com
解释:
awk '
BEGIN { # before processing the data
FS=OFS="." # set input and output delimiters to .
}
{
print $(NF-1),$NF # then print the next-to-last and last fields
}'
如果您任意长的fqdns也可以使用:
$ echo if.you.have.arbitrarily.long.fqdns.example.com |
awk 'BEGIN{FS=OFS="."}{print $(NF-1),$NF}'
example.com
[是的,有趣的是,您的版本确实适用于4.0.2。和awk版本20121220。