繁体   English   中英

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

[英]redirect each new line of stderr to consecutive file

我想将stderr的每行新行重定向到一系列文本文件。 我该怎么做呢?

我努力了:

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

您将需要读取输出的每一行,并将其显式重定向到新文件。

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循环中,该循环会将每一行重定向到一个每秒的文件。

#!/bin/bash

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

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

两条评论:

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

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

如果要将同一输出转到多个文件,则需要tee

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

另一个变体:

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

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

问题是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新行。
谢谢大家的帮助。
这是我的第一个问题,结果很好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM