将期望脚本的Bash输出转换为两个不同的文件

时间:2017-09-30 01:44:30

标签: bash tee

我正在尝试使用tee输出到两个不同的文件。我的第一个文件基本上是tail -f /myfile,我的第二个输出将是第一个文件的子集。我在网上看到他们说我们可以使用`|

tee >(proc1) >(proc2)

我已尝试过以上操作,但我的文件都是空白的。

这是我到目前为止所拥有的:

myscript.sh

ssh root@server 'tail -f /my/dir/text.log' | tee >(/mydir/my.log) >(grep 'string' /mydir/my.log > /mydir/mysecond.log)

myexpect.sh

#!/usr/bin/expect -f
set pass password

spawn /my/dir/myexpect.sh
expect {
    "key fingerprint" {send "yes/r"; exp_contiue}
    "assword: " {send "$pass\r"}
}
interact

1 个答案:

答案 0 :(得分:1)

在您的脚本中,tee

的使用存在一些问题
  1. tee >(/mydir/my.log):可以替换为tee /mydir/my.log,因为tee会写入stdout和文件,即/mydir/my.log
  2. grep 'string' /mydir/my.log > /mydir/mysecond.log:正如我所提到的,tee也会写入stdout,因此不需要grep来自文件的字符串,你可以直接从stdout grep。使用管道来做到这一点。
  3. 所以整个命令应该修改如下,

    ssh root@server 'tail -f /my/dir/text.log | tee /mydir/my.log | grep --line-buffered "string" > /mydir/mysecond.log'
    

    修改

    您的进一步问题

    • 由于tail -f仍在等待输出正在增长的文件,命令将挂起。如果您不希望该命令被挂起,请尝试删除-f for tail
    • 取决于tail存在的选项-f,您应使用两种不同的方式来允许grep写入文件。
      • 对于tail案例:grep可以成功写入文件
      • 对于tail -f案例:--line-buffered grep将在输出中使用行缓冲