将每个新的stderr行重定向到连续文件

时间:2013-07-02 21:37:33

标签: macos bash redirect pipe stderr

我想将进程的每个新行stderr重定向到一系列文本文件。 我怎么用bash做到这一点?

我试过了:

myProcess 2>&1 >/dev/null | grep 'Parsed' > parsed.txt | tail -f parsed.txt > line.`date +%s`.txt 

5 个答案:

答案 0 :(得分:1)

您需要读取输出的每一行并明确地将其重定向到新文件。

myProcess 2>&1 >/dev/null | grep 'Parsed' | tee parsed.txt | while IFS= read -r line; do
    echo "$line" >> line.$(date +%s).txt
done

请注意,使用teegrep中的每一行写入文件parsed.txt以及将每行重定向到每个行的while循环 - 第二个文件。

答案 1 :(得分:0)

#!/bin/bash

function splitter {
   grep 'Parsed' |
   while read L; do
      echo "$L" >> `date +%s`
   done
}

myProcess 2> >( splitter ) > /dev/null

两条评论:

  • 您使用2>& 1> / dev / null的技巧也可以使用,这是另一种方法。
  • 在拆分器中我必须使用'>>'不只是'>'因为很可能会在同一秒内打印两行,在这种情况下,您将获得文件中的最后一行。

答案 2 :(得分:0)

... | grep 'Parsed' > parsed.txt

您将所有grep输出重定向到parsed.txt,因此没有任何内容可以输入到下一个管道中。此外,tail从管道或文件中读取,而不是同时读取。

如果您希望相同的输出转到多个文件,则需要tee

myProcess 2>&1 >/dev/null | grep 'Parsed' | tee f1.txt | tee f2.txt > f3.txt

答案 3 :(得分:0)

另一种变体:

myprocess 2> >(sed 's/.*/echo "&">>$(date +%s)/e;d')

需要gnu sed& bash应该支持进程重定向。

答案 4 :(得分:0)

问题是OS X终端没有返回毫秒,并且每个时间戳文件中有很多行
我发现的解决方案是这样的:

我安装了deamontools:
http://cr.yp.to/daemontools/tai64n.html
获得以下实用程序:
 tai64n
 tai64nlocal

使用命令:

echo | tai64n | tai64nlocal

它返回:

2013-07-03 10:34:41.756602500 

所以我的最终剧本是:

#!/bin/bash

function splitter {
   grep 'Parsed' |
   while read L; do
    t=`echo | tai64n | tai64nlocal`
      echo "$L" >> parse."$t".txt
   done
}

myProcess 2> >( splitter ) > /dev/null

每个stderr新行。
谢谢大家的帮助 这是我的第一个问题,结果很棒