grep来自单个文件的多个模式,并将输出存储在每个模式的单独文件中

时间:2016-04-27 21:32:50

标签: bash grep

  

我有一个脚本可以从jmx.out文件中提取各种参数的指标。有办法吗?   在单个命令中实现逻辑以避免每次都读取jmx.out文件?

curl -s "server.hostname.com:12345/jmx"          > jmx.out
cat jmx.out | grep -E "CallQueueLength"          >> call_queue_length.out
cat jmx.out | grep -E "RpcProcessingTimeAvgTime" >> rpc_avg_time.out
cat jmx.out | grep -E "DeleteNumOps"             >> DeleteNumOps.out
cat jmx.out | grep -E "CreateFileOps"            >> CreateFileOps.out
cat jmx.out | grep -E "GetFileInfoNumOps"        >> GetFileInfoNumOps.out

2 个答案:

答案 0 :(得分:0)

我无法使用单个命令提供解决方案,但以下内容可能会有所帮助:

首先将所有必需的模式组合成一个变量(只是为了便于阅读):

pattern="RpcProcessingTimeAvgTime|DeleteNumOps|CreateFileOps|GetFileInfoNumOps"

现在遍历grep输出并将匹配的行重定向到一个文件,该名称将是当前匹配,省略其他字符:

grep -E $pattern jmx.out | while read line 
                            do fileName=`echo $line | grep -oE $pattern | head -1`
                            echo $line >> $fileName
                           done 

然而,它有其局限性。当一行包含多个匹配时,它将转到由首先遇到的模式命名的文件。删除head -1部分可以解决此问题,但如果单行包含多次相同的模式,则文件名将不合适。

答案 1 :(得分:0)

你可以做

sed -n -e "/CallQueueLength/w call_queue_length.out" -e "/RpcProcessingTimeAvgTime/w rpc_avg_time.out" ...

不客气