使用grep变量不起作用

时间:2014-06-03 05:42:03

标签: shell grep

我有一个文件VALIDATION_CONFIG_FILE.cfg,其中包含以下记录:

ES_VDF_1|1
DE_VDF_1|2
ES_VDF_1|7

当我通过使用变量使用下面的grep命令时,命令返回ES_VDF_1输出。根据我的理解,命令不应该给出任何结果。当我使用相同的命令而不使用变量(直接使用值)时,命令返回没有结果,这是预期的。那么我使用的变量有什么问题呢?

FEED_ID_1_7="HU_VDF_1"
FEED_ID_2_7="ES_VDF_1"
FEED_ID_3_7="PT_VDF_2"

awk -F'|' '{ if($2=="7") print $1; }' VALIDATION_CONFIG_FILE.cfg |
grep -E -v '${FEED_ID_1_7}|${FEED_ID_2_7}|${FEED_ID_3_7}'

输出:ES_VDF_1

awk -F'|' '{ if($2=="7") print $1; }' VALIDATION_CONFIG_FILE.cfg |
grep -E -v 'ES_VDF_1|HU_VDF_1|PT_VDF_2'

输出:没有

3 个答案:

答案 0 :(得分:2)

你看到的问题是Bash中的单引号不插入变量,而双引号则插入变量。

例如,变量富有想象力地称为" VARIABLE":

alex@yuzu:~$ export VARIABLE="foo"

如果用双引号回显它,则进行插值并使用变量的值:

alex@yuzu:~$ echo "$VARIABLE"
foo

但是,如果你使用单引号,那么文字字符串' $ VARIABLE'改为使用:

alex@yuzu:~$ echo '$VARIABLE'
$VARIABLE

你的grep也一样。

grep -E -v '${FEED_ID_1_7}|${FEED_ID_2_7}|${FEED_ID_3_7}'

应该是:

grep -E -v "${FEED_ID_1_7}\|${FEED_ID_2_7}\|${FEED_ID_3_7}"

例如:

alex@yuzu:~$ echo "foo" | grep -E "$VARIABLE|$HOME|$USER"
foo

alex@yuzu:~$ echo "foo" | grep -E '$VARIABLE|$HOME|$USER'
[ no output ]

答案 1 :(得分:2)

由于报价,这种情况正在发生。

单引号不会插入任何内容,但双引号会这样做。将单引号替换为带引号的双引号,如下所示:

awk -F'|' '{ if($2=="7") print $1; }' VALIDATION_CONFIG_FILE.cfg |
grep -E -v "${FEED_ID_1_7}|${FEED_ID_2_7}|${FEED_ID_3_7}"

有关详细信息,请参阅bash manual

答案 2 :(得分:1)

根据Kaoru / Nishu Tayal的回答,您可以通过fgrep和多个-e使用普通文本搜索来进一步提高安全性:

fgrep -v -e "${FEED_ID_1_7}" -e "${FEED_ID_2_7}" -e "${FEED_ID_3_7}"

这有助于防止误解,以防将特殊字符添加到变量值中。

如果您没有fgrep尝试grep -F