【问题标题】:use variable with grep使用 grep 变量
【发布时间】:2015-05-02 18:12:39
【问题描述】:

我正在尝试从电子邮件标题中提取值,作为消息 ID

grep 没有正确使用前面的变量...

这是我的代码:

for email in $1/*.eml
do

MSGID=$(cat ${email} | grep -i 'Message-ID:' |awk '{print $2}')
M=$(echo "\""${MSGID}"\"")
SRV="/var/log/maillog"
echo "${M}"

VER=$(grep -i ${M} ${SRV} | tail -n 1)
echo ${VER}
done

我正在尝试用 M 变量重新封装初始变量 MSGID;不幸的是,我仍然无法弄清楚这一点。

初始值(输入)如下所示:

Message-ID: <COMPUTER123DDF38c28d5e776e4fbdb82e2e92bd9a4373@computer123ddf>

MSGID 只保留字符串为:

<COMPUTER123DDF38c28d5e776e4fbdb82e2e92bd9a4373@computer123ddf>

然后我想将此字符串用于使用grep 的文件。不幸的是,VER 命令不会触发任何东西。

我认为添加 "\""${MSGID}"\"" 会/应该保持初始字符串不变。

【问题讨论】:

  • 这个脚本有很多多余的步骤。请edit您的问题提供您的输入和所需输出的示例。
  • 请显示一些输入文件以及您的预期输出。也许不值得将您当前的脚本作为起点,因为例如awk 可能会以直接的方式处理它。
  • MSGID=$awk '/^Message-ID:/ {print $2}' file) 可能会更快。另外,注意SRV 可以在for 循环之外声明,因为它是一个固定值。

标签: bash variables syntax grep


【解决方案1】:

目前还不清楚您要完成什么,但只需删除奇怪的东西就可以简化为可以帮助您完成任务的脚本。

SRV="/var/log/maillog"
for email in $1/*.eml; do
    M=$(awk 'tolower($0) ~ /message-id:/ {print $2}' "$email")
    echo "$M"
    grep -i "$M" "$SRV" | tail -n 1
done

这有许多有问题的极端情况。 Message-Id 提取应该更严格:

M=$(awk 'tolower($1) ~ /^message-id:/ { print $2 } /^$/ { exit(0) }' "$email")

如果提取的 Message-Id 包含正则表达式元字符,您应该转义它们,或者使用正确的 grep 标志:

grep -iF "$M" "$SRV" | tail -n 1

可以肯定的是,grep "$string" file 中的双引号不是grep 语法的一部分;它们在grep 运行之前被shell 丢弃,并且对于防止shell 混淆$string 值中的空格和/或shell 元字符很有用。当您强制输入另一对双引号时,您正在寻找日志文件中文字双引号内的 Message-id,并且(当然)没有找到任何内容。

【讨论】:

  • 我不知道awk 中的lc() 函数。要小写你可能想使用tolower()。请注意,您也可以在 BEGIN{} 块中说 IGNORECASE=1。
【解决方案2】:

试试这个解决方案

 M="\""$MSGID"\""

【讨论】:

    【解决方案3】:

    谢谢大家。很抱歉。

    我发现我的初始值中有一个回车。

    我已经改成这样了:

    MSGID=$(cat ${email} | grep -i 'Message-ID:' |awk '{print $2}' tr -d '\r')
    

    再次感谢您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 2013-01-03
      相关资源
      最近更新 更多