考虑一个包含字符串列表的文件,
string1
string2
...
abc\de
使用gawk的系统命令执行shell命令时 ,在这种情况下打印字符串,
cat file | gawk '{system("echo " $0)}'
最后一个字符串将被格式化为abcde。 $ 0表示整个记录,这里只是一个字符串
这是gawk系统命令的限制,无法输出未格式化的gawk变量吗?
答案 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中编写一个函数来预先格式化反斜杠以使其反转,然后将其传递给系统命令。