使用awk替换括号?

使用awk替换括号?

如何使用 awk 替换这两种情况下的括号?

  1. 将空括号更改为单词“None”

    192.168.0.24,向上,()

  2. 删除括号仅留下 host.domain.com

    192.168.0.25,向上,(host.domain.com)

答案1

使用 sed:

echo -e "192.168.0.25,Up,()\n1.2.3.4,Up,(host.domain.com)" | 
    sed 's/()/None/g;s/[()]//g'
192.168.0.25,Up,None
1.2.3.4,Up,host.domain.com

这是一个 awk 程序:

BEGIN {FS=","}
$3 ~ /\(\)/   { printf ($1","$2",None\n"); next }
$3 ~ /\(.+\)/ { 
                  gsub ("\\(", "")
                  gsub ("\\)", "")
              }
              { printf ($0"\n") }

调用它

echo -e "1.8.0.5,Up,()\n1.2.3.4,Up,(host.d.com)" | awk -f ip.awk 

例如。

答案2

这应该有效 -

awk -F"," -v OFS="," '
$NF=="()" {print $1,$2,"NONE";next}
{gsub(/\(|\)/,"",$NF);print}' INPUT_FILE

解释:

  1. 我们将字段分隔符设置为,并将输出字段分隔符设置为,。设置 OFS 使我们可以自由地避免显式打印所需的字段分隔符。

  2. 我们检查一个模式$NF=="()"(其中 $NF 是最后一个字段),如果为真,我们打印出第一个和第二个字段,并打印NONE为最后一个字段。由于您的示例数据只有三个字段,因此这种方法应该没问题。但是,如果您有超过 5 个字段,那么使用简单的字段for loop将是理想的选择。只要确保for loopi=1;i<NF;i++这样工作,您就可以手动放置最终字段。我们还使用next关键字移动到下一行,因为我们不希望第二个操作在第一行运行。

  3. 第二个操作语句对于与第一个操作语句不匹配的所有行均成立。在这里,我们使用全局替换内置函数,将 替换brackets为空。

测试:

[jaypal:~/Temp] cat file
192.168.0.24,Up,()
192.168.0.25,Up,(host.domain.com)
192.168.0.24,Up,()
192.168.0.24,Up,()
192.168.0.25,Up,(host.domain.com)
192.168.0.25,Up,(host.domain.com)

[jaypal:~/Temp] awk -F"," -v OFS="," '
$NF=="()" {print $1,$2,"NONE";next}
{gsub(/\(|\)/,"",$NF);print}' file
192.168.0.24,Up,NONE
192.168.0.25,Up,host.domain.com
192.168.0.24,Up,NONE
192.168.0.24,Up,NONE
192.168.0.25,Up,host.domain.com
192.168.0.25,Up,host.domain.com

相关内容