以下grep
命令返回包含字符串 的文件ptrn
。该sed
命令使用存储在stp
.
grep -rl "${isufx[@]}" -e "$ptrn" -- "${fdir[@]}" |
sed "${sta}~${stp}!d" >> $logfl
这将是结果
cat /home/flora/logs/27043-T13:09:44.893003954.log
file1.sh
file2.sh
file3.sh
file4.sh
file5.sh
file6.sh
我想得到以下结果
cat /home/flora/logs/27043-T13:09:44.893003954.log
File: file1.sh
+ file2.sh
+ file3.sh
+ file4.sh
+ file5.sh
+ file6.sh
但我认为人们无法做到这一点grep
。有些人可能会建议awk
在文件上使用logfl
。
答案1
使用 GNU recttools (你提到的在评论中你的另一个问题):
: >output
recins -f File -v "$(cat logfile)" output
这将创建或清空名为 的文件output
,然后插入一个名为 的字段,File
其值是文件的内容logfile
。
请注意,+
在 GNU recfile 格式中,这些字符被视为换行符,因此上面的操作是插入单一值,包含嵌入的换行符。
如果您想将每个文件名作为单独的元素插入,您可以使用
: >output
xargs -I {} recins -f File -v {} output <logfile
上面的代码recins
每行调用一次logfile
,并为每行插入一个单独的键值对。
如果我们让输入为 CSV 文件,则可以更有效地完成此操作:
{ echo File; cat logfile; } | csv2rec >output
echo
此处使用该命令将 CSV 标头添加到 的输入数据之前csv2rec
。
答案2
我这样解决了问题
grep -rl "${isufx[@]}" -e "$ptrn" -- "${fdir[@]}" |
sed '1s/^/File: /;1!s/^/+ /' >> $logfl