如何使用 awk 替换这两种情况下的括号?
将空括号更改为单词“None”
192.168.0.24,向上,()
删除括号仅留下 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
解释:
我们将字段分隔符设置为
,
并将输出字段分隔符设置为,
。设置 OFS 使我们可以自由地避免显式打印所需的字段分隔符。我们检查一个模式
$NF=="()"
(其中 $NF 是最后一个字段),如果为真,我们打印出第一个和第二个字段,并打印NONE
为最后一个字段。由于您的示例数据只有三个字段,因此这种方法应该没问题。但是,如果您有超过 5 个字段,那么使用简单的字段for loop
将是理想的选择。只要确保for loop
像i=1;i<NF;i++
这样工作,您就可以手动放置最终字段。我们还使用next
关键字移动到下一行,因为我们不希望第二个操作在第一行运行。第二个操作语句对于与第一个操作语句不匹配的所有行均成立。在这里,我们使用全局替换内置函数,将 替换
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