【问题标题】:Using variables with grep is not working使用 grep 变量不起作用
【发布时间】:2014-06-03 05:42:02
【问题描述】:

我有一个文件 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'

输出:什么都没有

【问题讨论】:

  • 嗨乔纳森...我已经编辑了这个问题
  • 感谢您的澄清。请删除您的评论,并将其标记为已过时(以防我无法删除它)。
  • 这个awk -F'|' '{ if($2=="7") print $1; }' VALIDATION_CONFIG_FILE.cfg可以缩短一些awk -F\ '$2=="7" {print $1}' VALIDATION_CONFIG_FILE.cfg

标签: shell grep


【解决方案1】:

您看到的问题是 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 ]

【讨论】:

    【解决方案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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-05-02
        • 2019-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多