我正在尝试创建一个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]"
基本上,我试图将两条信息拼接在一起:
- 文件的文件路径
- 文件本身的内容(输入)
下面是文件路径的示例:
/opt/splunk/etc/deployment-apps/TA-XA6x-Server/local/inputs.conf
这是inputs.conf文件内容的示例:
[perfmon://TCPv4]
简单,主要是工作的方法如下:
#!/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
参数进行grep
并适当调整read
用法:
#!/bin/bash
while IFS= read -r -d '' name && IFS= read -r content; do
printf 'app="%s" | input="%s"n' "$name" "$content"
done < <(grep -r --null --include "inputs.conf" "[")