我有一个输出一些值/数字的脚本,我想将它们分成两个文件。我正在看类似的东西:
./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