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

Macos 将stderr的每一新行重定向到连续文件,macos,bash,redirect,pipe,stderr,Macos,Bash,Redirect,Pipe,Stderr,我想将一个进程的每一行stderr重定向到一个文本文件序列。 在bash中如何实现这一点 我试过: 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 p

我想将一个进程的每一行stderr重定向到一个文本文件序列。 在bash中如何实现这一点

我试过:

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

还要注意使用
tee
grep
中的每一行写入文件
parsed.txt
,以及将每一行重定向到每秒一个文件的
while
循环。

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

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

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

myProcess 2> >( splitter ) > /dev/null
还要注意使用
tee
grep
中的每一行写入文件
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的技巧也会起作用,这是另一种方法
  • 在splitter中,我必须使用“>>”而不仅仅是“>”,因为很可能在同一秒中会打印两行,在这种情况下,您只会得到文件中的最后一行
两点意见:

  • 使用2>&1>/dev/null的技巧也会起作用,这是另一种方法
  • 在splitter中,我必须使用“>>”而不仅仅是“>”,因为很可能在同一秒中会打印两行,在这种情况下,您只会得到文件中的最后一行
您将所有
grep
输出重定向到
parsed.txt
,这样就没有任何东西可以输入下一个管道。另外,
tail
从管道或文件中读取,而不是同时从管道或文件中读取

如果要将相同的输出发送到多个文件,则需要
tee

myProcess 2>&1 >/dev/null | grep 'Parsed' | tee f1.txt | tee f2.txt > f3.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应支持进程重定向。

另一个变体:

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

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

问题是OS X终端不返回毫秒,并且每个时间戳文件都有很多行。

我找到的解决方案如下:

我是从以下位置安装deamontools的:

要获取以下实用程序:
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新品。
谢谢大家的帮助。

这是我的第一个问题,结果很好。问题是OSX终端没有返回毫秒,每个时间戳文件都有很多行
我找到的解决方案如下:

我是从以下位置安装deamontools的:

要获取以下实用程序:
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新品。
谢谢大家的帮助。

这是我的第一个问题,结果很好,谢谢你,切普纳。我的问题似乎是输出时间过快。我每秒有几行,谢谢你,切普纳。我的问题似乎是输出时间过快。我每秒有几行,哪一行?当您继续写入文件时,会不断出现新行。通过这样做,您想要解决的实际问题是什么?我正在解析视频流以获取有关结构的信息。抱歉,我仍然不明白(可能是我缺乏视频处理方面的知识),为什么在不同的输出文件中捕获行会有所帮助?让你的脚本将这些行“翻译”成你实际上正在寻找的结构信息不是更明智吗?在这种特殊情况下,我正在解析一个视频流以获得有关结构的信息。我需要得到精确变化的纵横比。如果我需要解析视频流请求的系统日志,我也会遇到同样的情况。所以我试着思考如何把这个问题变成一个通用的解决方案,它是关于一个通过IP传输的实时视频流。视频需要转换。所以在转换之前我需要这些信息。输出是针对Http实时流媒体的,它以小块的形式出现。所以解析器的每一行都包含信息流编码应该如何发生哪一行?当您继续写入文件时,会不断出现新行。通过这样做,您想要解决的实际问题是什么?我正在解析视频流以获取有关结构的信息。抱歉,我仍然不明白(可能是我缺乏视频处理方面的知识),为什么在不同的输出文件中捕获行会有所帮助?让你的脚本将这些行“翻译”成你实际上正在寻找的结构信息不是更明智吗?在这种特殊情况下,我正在解析一个视频流以获得有关结构的信息。我需要得到精确变化的纵横比。如果我需要解析视频流请求的系统日志,我也会遇到同样的情况。所以我试着思考如何把这个问题变成一个通用的解决方案,它是关于一个通过IP传输的实时视频流。视频需要转换。所以在转换之前我需要这些信息。输出是针对Http实时流媒体的,它以小块的形式出现。所以解析器的每一行都包含了流编码应该如何发生的信息,我认为它应该与bash相同,我更改了标记对不起,我认为它应该与bash相同,我更改了标记