首页 > 解决方案 > 将 grep STDERR 过滤的重定向到文件

问题描述

这篇文章http://burgerbum.com/stderr_pipe.html解释了如何 grep STDERR,过滤后的结果在屏幕上回显。

示例:归档程序 tar 在 STDERR 上产生大量错误消息,其中一些很重要,而另一些可以忽略。我们只想看到那些表明确实有问题的人。

tar -cf /tmp/junk.tar /tmp/real /tmp/fake
tar: Removing leading `/' from member names
tar: /tmp/fake: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors

为了从 STDERR 中删除tar: Removing leading '/' from member namestar: Error exit delayed from previous errors离开tar: /tmp/fake: Cannot stat: No such file or directory,作者建议如下:

(tar -cf /tmp/junk.tar /tmp/real /tmp/fake 3>&1 1>&2 2>&3 | egrep -v "tar: Removing leading|tar: Error exit delayed from previous errors") 3>&1 1>&2 2>&3

唯一的 STDERR 输出将是:tar: /tmp/fake: Cannot stat: No such file or directory

问题:如何实现相同的结果,而不是回显 => 写入文件?

我使用了 tar 示例,因为它是本文原生的。

但我的真实情况mysqldump,它生成 STDOUT(我不想弄乱),并且还生成 STDERR - 我需要过滤并写入文件。

mysqldump --user=db_username --password=db_password --add-drop-database --host=db_host db_name 2>> '/srv/www/data_appsrv/logs/mysql_date_ym.log' > '/mnt/backup_srv/PFTLXTKDEV/backup/daily/file_nm_db'

我需要Warning: Using a password从写入的 STDERR 中排除字符串mysql_date_ym.log

我尝试了 and 的变体2>>>但没有一个有效。

标签: bashgreppipestdoutstderr

解决方案


在 bash 中,只需:

tar ... 2> >(egrep -v ... >&2)

或归档:

tar ... 2> >(egrep -v ... >the_file.txt )

我认为用 2 个描述符切换 1 没有任何价值,只需使用第 3 个描述符,它已经存在了。

( tar ... 2>&1 1>&3 | egrep -v ... ) 3>&1 1>&2

或者您似乎想将egrep输出重定向到文件。然后这样做:

( tar ... 2>&1 1>&3 | egrep ... >thefile.txt ) 3>&1
# or
( tar ... 2>&1 1>&3 | egrep ... ) 3>&1 1>thefile.txt
# or just
( tar ... 2>&1 1>&3 | egrep ... ) 3>&1 >thefile.txt

或通过该切换:

( tar ... 3>&1 1>&2 2>&3 | egrep ... ) 3>&1 1>thefile.txt 2>&3
( tar ... 3>&1 1>&2 2>&3 | egrep ... >thefile.txt ) 3>&1 2>&3
# it's just:
( tar ... 3>&1 1>&2 2>&3 | egrep ... >thefile.txt ) 2>&1

推荐阅读