从日志文件的 sftp 连接中排除特定行

Exclude specific lines from sftp connection from logfile

我有多个脚本可以连接到 sftp 服务器和 put/get 文件。最近 sftp 管理员为所有登录添加了一个大 header,这已经炸毁了我的日志文件,我想排除它,因为它会炸毁文件大小并使日志有些不可读。

照原样,命令格式如下:

sftp user@host <<EOF &>> ${LOGFILE}
get ...
put ...
exit
EOF

现在,我已经尝试找出所有以管道开头的新行(他们基本上制作了一个盒子来放入它们)。

sftp user@host <<EOF | grep -v '^|' &>> ${LOGFILE}
get ...
put ...
exit
EOF

这排除了 ${LOGFILE} 中的行,但将它们扔到 stdout 中,这意味着它们最终出现在另一个日志文件中,我们也不希望它们出现(这些脚本由调度器)。奇怪的是,它似乎也从连接尝试输出中过滤掉了第一行。

Connecting to <host>...

并将其重定向到 stdout。不是世界末日,但我确实觉得很奇怪。

如何过滤以 | 开头的行,使它们不显示在任何地方?

sftp user@host <<EOF &>> ${LOGFILE}

您正在将 stdout 和 stderr 重定向到日志文件以附加数据 (&>>)。但是当你使用

sftp user@host <<EOF | grep -v '^|' &>> ${LOGFILE}

您只是将 stdout 重定向到 grep,让 sftp 的 stderr 输出保持原样。最后,您再次将 grep 的 stdout 和 stderr 重定向到日志文件。

事实上,您有兴趣从 sftp 重定向两者(stdout 和 stderr),因此您可以使用类似的东西:

sftp user@host <<EOF |& grep -v '^|' >> ${LOGFILE}

或者,在旧版本的 bash 中,使用特定的重定向而不是 shorthand:

sftp user@host <<EOF 2>&1 | grep -v '^|' >> ${LOGFILE}