使用 awk 打印反斜杠

使用 awk 打印反斜杠

使用 awk 时,我在打印(或搜索)包含反斜杠的序列时遇到问题 例如 -

echo "test\test" | awk '{ gsub(/\\\\t/, "\\\\&"); print }'

将给出结果:

test    est

因为 \t 将被解释为制表符。我希望能够按原样保留字符串,意思是:

test\test

echo 命令只是我检查 awk 命令的 1 行的另一种方法,以查看它是否可以在文件中找到诸如 \t 之类的模式(使用 bash 脚本)。更具体地说 - 如果我想要一个 awk cmd 需要找到一系列

\"

我正在使用以下内容:

awk -v st="$match_string" 'BEGIN {gsub(/\\\\"/,"\\\\&", st)} match($0,st {print;exit}' file.txt

但 cmd 不起作用:对于具有以下内容的文件:

547 %$ 
236 \"
4523 &* 
8876 (*
8756 "/
...

它将输出:

> \"
8756 "/

使用 awk 查找的正确方法是什么

236 \"

谢谢

答案1

是您echo将 扩展\t为制表符。不要用于echo输出包含反斜杠的字符串。代替使用printf

printf '%s\n' 'test\test' | awk '{ print }'

也可以看看:


考虑更新的问题:

您想要匹配\"一些数据的第二列,并将字符串\"作为程序的参数给出awk

string='\\"'
awk -v string="$string" '$2 == string' file

这将返回

236 \"

给出问题中的数据。请注意,您必须转义反斜杠,因为您需要在调用时在 shell 中扩展变量一次awk

您还可以使用

string='\"' awk '$2 == ENVIRON["string"]' file

即,将字符串作为环境变量传递到awk程序中。在这种情况下,反斜杠确实不是需要逃脱。

要对整行使用正则表达式,请使用

string='\\\\"'
awk -v string="$string" '$0 ~ string' file

或者,

string='\\"' awk '$0 ~ ENVIRON["string"]' file

正则表达式中的反斜杠匹配是通过 完成的\\,所以这就是我们必须传递给 的内容awk。使用 时awk -v,每个反斜杠需要加倍,因为$string在调用 时会扩展命令行上的值awk

另请注意,如果您在使用将字符串传递到程序string时使用双引号来设置值,则必须将所有双引号加倍awk -vawk再次(因为 shell 作用于双引号反斜杠),转义字符串中的双引号:

string="\\\\\\\\\""
awk -v string="$string" '$0 ~ string' file

因此,这里的第一行在shell 中设置string为,然后将根据我们需要将反斜杠和双引号匹配为正则表达式来求值。\\\\"awk -v string="$string"awk -v string='\\"'

答案2

只是echo "test\\test"会做你想做的事,但如果你更喜欢 awk,你可以像这样打印它:

$ echo "test\test" | awk ' { print }'
test\test

相关内容