如何使用grep或sed过滤stderr中指定错误信息,保留其他有效报错?
解决方案
可以通过shell重定向结合grep/sed过滤特定错误行,同时保留其余stderr报错信息,具体实现如下:
方法1:使用grep过滤
将stderr重定向到管道做反选过滤后,再将剩余错误输出导回stderr,不会影响命令原本的正常输出和报错逻辑:
kubectl cp -n $OVN_NAMESPACE -c ovnkube-node $ovnkube_node:$save_dir ${WORKDIR}/restore_flows 2>&1 >/dev/null | grep -v "tar: Removing leading \`/' from member names" 1>&2
参数说明:
2>&1:将标准错误合并到标准输出>/dev/null:丢弃命令原本的标准输出,仅保留原标准错误内容传递给后续管道grep -v 目标字符串:反选排除掉指定的提示行1>&2:将过滤后剩余的错误信息重新输出到标准错误,符合原有命令的输出逻辑
方法2:使用sed过滤
匹配到指定提示行后直接删除,匹配规则更精准:
kubectl cp -n $OVN_NAMESPACE -c ovnkube-node $ovnkube_node:$save_dir ${WORKDIR}/restore_flows 2>&1 >/dev/null | sed '/^tar: Removing leading `\/'\'' from member names$/d' 1>&2
根因修复方案
该提示出现的原因是kubectl cp底层依赖tar实现文件传输,当你传入的容器内路径为绝对路径时,tar会默认去掉开头的/避免解压时覆盖系统文件。你可以直接将容器内的源路径改为相对路径(去掉开头的/),即可从根源避免该提示出现,无需额外做过滤。
内容的提问来源于stack exchange,提问作者user16541120
相关产品推荐
相关产品推荐

