【问题标题】:Can you use grep or sed to remove a particular error message from stderr?您可以使用 grep 或 sed 从 stderr 中删除特定的错误消息吗?
【发布时间】:2021-12-12 00:48:34
【问题描述】:

我正在脚本中运行以下命令:

kubectl cp -n $OVN_NAMESPACE -c ovnkube-node $ovnkube_node:$save_dir ${WORKDIR}/restore_flows

但是,它每次运行时都会向 stderr 输出“tar:从成员名称中删除前导 `/'”。除此之外,它运行良好,但是,我需要删除此错误消息。我只会将所有标准错误发送到 /dev/null,但我希望保留其他可能真正重要的错误。

因此,我的问题是是否可以使用 grep 或 sed 从输出中删除特定错误消息并允许其他人通过?

【问题讨论】:

  • 使用2>&1 将标准错误重定向到标准输出。然后你可以通过管道将它发送到grep -v
  • 我想不出理由。
  • 请参阅How can I pipe stderr and not stdout? 了解有关管道标准错误的讨论。有关过滤标准错误的讨论,请参阅How can. I exclude all "permission denied" messages from find?
  • @sdaniele 我不知道kubectl。是否有可能提示您回答问题?它可能会将提示写入stderr,并且缓冲会阻止您看到它。
  • 实际上,我可能知道问题所在——如果您启用了set -e,那么如果stderr 上根本没有消息,grep -v 可以返回非零返回状态。 In general, set -e is a bad idea.

标签: bash sed grep stdout stderr


【解决方案1】:

感谢@CharlesDuffy,因为我不想关闭 set -e,所以通过一个轻微的解决方法解决了这个问题:

kubectp cp .... 2>&1 | grep -v 'unwanted error' || true >&2

【讨论】:

  • 顺便说一句,确保您使用的是pipefail——否则只有管道的最后一段(在本例中为grep)被评估为退出状态。
  • 你可以用|&替换2>&1 |
  • 请注意,这可能会产生不令人满意的结果,因为您的 grep 也会处理 /dev/stdout 这可能是您不想要的
【解决方案2】:

以下两种方法只会处理stderr,不会处理

1.在子shell中处理stderr

$ kubectp cp ... 2> >(grep -v 'unwanted error' - )

2。使用重定向交换过滤stderr:

$ { kubectp cp ... 2>&1 1>&3 | grep -v 'unwanted error' - 1>&2; } 3>&- 3>&1

执行以下操作:

  • 运行命令kubectp cp ...
  • stdout 的输出重定向到fd3 (1>&3) 并将stderr 重定向到stdout (2>&1)
  • grep处理新的stdout(实际的stderr)并将输出重定向回stderr1>&2
  • 最后,我们将fd3 的输出重定向回stderr (3>&1) 并关闭fd3 (3>&-)

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2018-08-25
    • 2019-01-01
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多