评估程序输出中的多个模式并写入特定于模式的文件

评估程序输出中的多个模式并写入特定于模式的文件

我有一个输出一些值/数字的脚本,我想将它们分成两个文件。我正在看类似的东西:

./runme.sh | grep 'ook' >> ook.out | grep 'eek' >> eek.out

在这种情况下,第二个管道不应采用第一个 grep 的输出,而应采用 runme.sh 的输出。那可能吗?

答案1

这是该实用程序的完美用例pee

./runme.sh | pee "grep ook >> ook.out" "grep eek >> eek.out"

在 Debian 及衍生版本中,pee可以在 package.json 中找到moreutils

答案2

那么你应该对这两种模式都执行egrep。

`/.runme.sh | egrep “ok|eek”

但似乎您需要将每个模式评估输出重定向到其自己的文件,而 grep 似乎不支持该文件。任何人,如果可能的话请纠正我。

编辑:minaev 给出了来自 moreutils 的 pee 的工作示例,但是如果您的平台上缺少 pee,我们仍然可以像这样使用 tee。只需玩一下进程替换即可。

./runme.sh |tee >(grep ook > ook.txt) >(grep eek > eek.txt)

例子:

[centos@centos scripts]$ ./runme.sh
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
ook
[centos@centos scripts]$ ./runme.sh | tee >(grep eek >eek.txt) >(grep ook >ook.txt)
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
ook
[centos@centos scripts]$ cat eek.txt 
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
[centos@centos scripts]$ cat ook.txt 
keekookjsfskooeek
ook
[centos@centos scripts]$ 

答案3

简单的awk替代方案:

./runme.sh | awk '/ook/{print>>"ook.out"}/eek/{print>>"eek.out"}'

只需少量添加,awk代码就可以轻松扩展 - 只需放入数组 r 即可,因为需要许多正则表达式-输出文件对:

./runme.sh | awk 'BEGIN{r["ook"]="ook.out";r["eek"]="eek.out"}{for(i in r)if($0~i)print>>r[i]}'

sed w命令相当于>,遗憾的是无法附加到文件:

./runme.sh | sed -n $'/ook/wook.out\n/eek/week.out'

答案4

命令球座可以在临时文件中保留管道流的副本。然后我们可以分别 grep 原始 stdout 和临时文件:

./runme.sh |tee temp |grep ook >>ook.out;grep eek temp >>eek.out

相关内容