转义awk参数

时间:2015-08-13 17:05:17

标签: shell unix awk

在unix shell脚本中我有

filename=myfile
LOG=/dir/log*
j=`awk '/AAAA/ && /BBB/ && /${filename}/ && /CCC/' ${LOG}`

但是当脚本运行时,使用set -x我会看到:

awk /AAA/ && /BBB/ && /${filename}/ && /CCC/ /dir/log1 /dir/log2

如何在awk参数中转义$ {filename}变量以使其正确解析?

说明我要做的事情

我有一个名为/tmp/S20150814.001的文件,其中包含

This line contains AAAA and BBB and CCC and bcd_input_13082015_0800.txt

在我的脚本中,如果我使用

MYLOG=/tmp/S20150814.001
j=`awk '/AAAA/ && /BBB/ && /bcd_input_13082015_0800.txt/ && /CCC/' ${MYLOG}`
if [[ ${#j} -gt 0 ]]
then

并运行我看到的脚本

+ + awk /AAAA/ && /BBB/ && /bcd_input_13082015_0800.txt/ && /CCC/      /tmp/S20150814.001
j=This line contains AAAA and BBB and CCC and bcd_input_13082015_0800.txt
+ [[ 71 -gt 0 ]]

但如果我将脚本更改为

MYLOG=/tmp/S20150814.001
filename=bcd_input_13082015_0800.txt
j=$(awk -v filename="$filename" '/AAAA/ && /BBB/ && $0==filename && /CCC/' ${MYLOG})
if [[ ${#j} -gt 0 ]]
then

然后运行它,我得到了

+ + awk -v filename=bcd_input_13082015_0800.txt /AAAA/ && /BBB/  &&  $0==filename && /CCC/ /tmp/S20150814.001
j=
+ [[ 0 -gt 0 ]]

2 个答案:

答案 0 :(得分:5)

您不应该将文件名放在awk脚本的代码中。如果你需要传入一个变量,awk就有了一个选项。

j=$(awk -v filename="$filename" '/AAAA/ && /BBB/ && $0~filename && /CCC/' ${LOG})

或者,由于您的文件名可能包含被解释为正则表达式一部分的字符,您可能真的想要:

j=$(awk -v filename="$filename" '/AAAA/ && /BBB/ && $0==filename && /CCC/' ${LOG})

另请参阅:https://stackoverflow.com/a/9712555/1072112以获取有关各种类型报价的工作方式的一些帮助。

答案 1 :(得分:0)

我的工作是

j=$(awk -v filename="$filename" '/AAAA/ && /BBB/ && $0 ~ filename && /CCC/' ${MYLOG})

即“〜”之前和之后需要一个空格