文件与结构化信息匹配

文件与结构化信息匹配

以下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

相关内容