Shell 在grep中使用变量不起作用

Shell 在grep中使用变量不起作用,shell,grep,Shell,Grep,我有一个文件VALIDATION\u CONFIG\u 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

我有一个文件VALIDATION\u CONFIG\u 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'

输出:nothing

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

例如,对于一个想象中被称为“变量”的变量:

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

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 ]

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

例如,对于一个想象中被称为“变量”的变量:

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

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 ]

这是由于引用而发生的

单引号不能插入任何内容,但双引号可以。使用如下变量将单引号替换为双引号:

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}"

有关更多详细信息,请参阅

这是由于引用而发生的

单引号不能插入任何内容,但双引号可以。使用如下变量将单引号替换为双引号:

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}"

有关更多详细信息,请参见添加到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

添加到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

你好,乔纳森……我已经编辑了问题,谢谢您的澄清。请删除您的评论,并将此标记为过时(以防我无法删除)。此
awk-F'|'{if($2==“7”)print$1;}'验证配置文件.cfg
可以缩短一些
awk-F\'$2==“7”{print$1}验证配置文件.cfg
你好,乔纳森…我编辑了问题,谢谢澄清。请删除您的评论,并将其标记为过时(以防我无法删除)。此
awk-F'|'{if($2==“7”)print$1;}'验证配置文件.cfg
可以缩短一些
awk-F\'$2==“7”{print$1}验证配置文件.cfg