我有一个文件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'产出:无
发布于 2014-06-03 06:36:49
您所看到的问题是,Bash中的单引号不插值变量,而双引号则这样做。
例如,有一个被称为“变量”的变量:
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 ]发布于 2014-06-03 06:38:25
这是由于引号造成的。
单引号不会插入任何内容,但是双引号可以。用如下所示的变量替换单引号为双引号:
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}"有关更多细节,请参阅巴什手册
发布于 2014-06-03 06:42:15
在Kaoru/ normal的回答中,使用fgrep和multiple -e的普通文本搜索可以使其更加安全。
fgrep -v -e "${FEED_ID_1_7}" -e "${FEED_ID_2_7}" -e "${FEED_ID_3_7}"这将有助于防止误读,以防在变量的值中添加特殊字符。
如果您没有fgrep,请尝试grep -F。
https://stackoverflow.com/questions/24007882
复制相似问题