适用于awk v4.0.2,但不适用于> = 4.2.1的awk表达式

问题描述 投票:0回答:3

我有这个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版本中起作用?

bash ubuntu awk centos7 alpine
3个回答
1
投票

对于您提供的样品,请尝试以下。这将尝试从第一个.到行的最后匹配正则表达式,然后在第一个点到行的最后打印。

echo www.host.com | awk 'match($0,/\..*/){print substr($0,RSTART+1,RLENGTH-1)}'


[OP的代码修复:]如果OP想要使用他/她自己的经过尝试的代码,则可以使用以下帮助。这里有2点:1-我们不需要与awk一起使用任何其他命令来进行处理。 2-我们需要在每一行中都在FS部分中设置OFSBEGIN的值。

echo www.host.com | awk 'BEGIN{FS=OFS="."} {$1="";sub(/\./,"");print}'

1
投票

您在awk上有2个很好的答案,但我认为应该用cut处理,因为它很简单,它可以使所有字段开始到一个已知位置:

echo 'www.host.com' | cut -d. -f2-

host.com

使用的选项是:

  • -d.:将定界符设置为.
  • -f2-:提取从位置2开始的所有字段

1
投票

要获取域,请使用:

$ 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。

© www.soinside.com 2019 - 2024. All rights reserved.