gawk system-command忽略反斜杠

时间:2014-10-21 01:53:34

标签: gawk

考虑一个包含字符串列表的文件,

string1
string2
...
abc\de

使用gawk的系统命令执行shell命令时 ,在这种情况下打印字符串,

cat file | gawk '{system("echo " $0)}'

最后一个字符串将被格式化为abcde。 $ 0表示整个记录,这里只是一个字符串

这是gawk系统命令的限制,无法输出未格式化的gawk变量吗?

2 个答案:

答案 0 :(得分:1)

扩展MusséRedi的答案,请注意,在下文中,反斜杠不会打印出来:

$ echo 'abc\de' | gawk '{system("echo " $0)}'
abcde

但是,这里会打印反斜杠:

$ echo 'abc\de' | gawk '{system("echo \"" $0 "\"")}'
abc\de

不同之处在于后一个命令将$0传递给shell,并在其周围加上双引号。双引号改变了shell处理反斜杠的方式。

确切的行为将从一个shell更改为另一个shell。

要避免所有外壳变幻莫测的打印,一个简单的解决方案是:

$ echo 'abc\de' | gawk '{print $0}'
abc\de

答案 1 :(得分:0)

在Bash中,我们使用双反斜杠来表示实际的反斜杠。单个反斜杠的功能是转义一个字符。因此,系统命令根本不是格式化的; Bash是。

这个问题的解决方案是在awk中编写一个函数来预先格式化反斜杠以使其反转,然后将其传递给系统命令。