在bash脚本中重新格式化grep中的名称/内容对

时间:2016-05-26 20:44:16

标签: linux bash shell

我正在尝试创建一个bash脚本,该脚本将为两个单独的数据grep单个文件,并将它们打印到stdout。

到目前为止,这就是我所拥有的:

#!/bin/sh
cd /my/filePath/to/directory

APP=`grep -r --include "inputs.conf" "\[" | grep -oP '^[^\/]+'`
INPUT=`grep -r --include "inputs.conf" "\[" | grep -oP '\[[^\]]+'`

for i in $APP
do
{cd /opt/splunk/etc/deployment-apps
 INPUT=`grep -r --include "inputs.conf" "\[" | grep -oP '\[[^\]]+'`
 echo -n "$i | $INPUT"}

done
echo "";
exit

这给了我一个输出打印第一个命令的整个输出(大约200行),然后是|,然后另一个输出来自第二个命令。我以为我可以创建一个阵列来做这个,但是我还在学习bash。

这是命令的输出示例,没有管道到grep:

TA-XA6x-Server/local/inputs.conf:[perfmon://Processor]

一次执行中有200多个,我希望将这些格式打印成这样的

app="TA-XA6x-Server/local/inputs.conf:" | input="[perfmon://Processor]"

我试图将两条信息拼凑在一起:

  1. 文件的文件路径
  2. 文件本身的内容(输入)
  3. 以下是文件路径的示例:

    /opt/splunk/etc/deployment-apps/TA-XA6x-Server/local/inputs.conf
    

    这是inputs.conf文件内容的一个例子:

    [perfmon://TCPv4]
    

1 个答案:

答案 0 :(得分:1)

简单易行的方法是这样的:

#!/bin/bash

while IFS=: read -r name content; do
  printf 'app="%s" | input="%s"\n' "$name" "$content"
done < <(grep -r --include "inputs.conf" "\[")

如果您需要可靠地使用所有可能的文件名(包括带冒号或换行符的名称)并且可以使用GNU grep,请考虑--null的{​​{1}}参数并调整grep用法适当地:

read