gpt4 book ai didi

linux - 使用 shell 脚本从特定日志文件创建 CSV 文件

转载 作者:太空狗 更新时间:2023-10-29 11:49:05 32 4
gpt4 key购买 nike

我正在尝试在 Linux 中使用 sed、awk、粘贴命令将特定日志文件转换为 CSV 文件,以便能够使用 gnuplot 或 MS Excel 绘制它。但是,我无法按照我想要的方式进行。这是示例日志文件:

Feb 15 13:57:08 Program1: The pool size: 100 [High: 80 Norm: 20 Low: 0]
Feb 15 13:58:53 Program1: The pool size: 100 [High: 0 Norm: 100 Low: 0]
Feb 15 13:58:54 Program3: The pool size: 200 [High: 0 Norm: 200 Low: 0]
Feb 15 13:58:56 Program4: The pool size: 100 [High: 0 Norm: 100 Low: 0]
Feb 15 13:58:58 Program1: The pool size: 200 [High: 0 Norm: 200 Low: 0]
Feb 15 13:58:59 Program5: The pool size: 300 [High: 100 Norm: 200 Low: 0]
Feb 15 13:59:05 Program1: The pool size: 100 [High: 0 Norm: 100 Low: 0]
Feb 15 14:00:11 Program2: The pool size: 100 [High: 0 Norm: 100 Low: 0]
Feb 15 14:00:12 Program2: The pool size: 100 [High: 0 Norm: 100 Low: 0]
Feb 15 14:00:13 Program1: The pool size: 200 [High: 0 Norm: 200 Low: 0]
Feb 15 14:00:16 Program4: The pool size: 100 [High: 0 Norm: 100 Low: 0]
Feb 15 14:00:17 Program2: The pool size: 100 [High: 50 Norm: 50 Low: 0]
Feb 15 14:02:28 Program5: The pool size: 100 [High: 0 Norm: 100 Low: 0]
Feb 15 14:02:31 Program1: The pool size: 100 [High: 0 Norm: 100 Low: 0]
Feb 15 14:11:01 Program1: The pool size: 100 [High: 0 Norm: 100 Low: 0]

我正在尝试将上述数据转换为 CSV 文件,以便在特定时间点获得数据。我期望的输出 CSV 应采用以下格式:

时间戳,Program1_Total,Program1_High,Program1_Norm,Program1_Low,Program2_Total,Program2_High,Program2_Norm,Program2_Low,Program3_Total,Program3_High,Program3_Norm,Program3_Low,Program4_Total,Program4_High,Program4_Norm,Program4_Low

Feb 15 13:57:08,100,80,20,0,0,0,0,0,0,0,0,0,0,0,0,0
Feb 15 13:58:53,100,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0
...
...

我尝试了什么?

我尝试对特定程序进行 grepping,并通过以下方式创建特定于该程序的单独的较小文件:

grep "Program1" sample.log > Program1.log
grep "Program2" sample.log > Program2.log

我尝试使用粘贴命令加入他们。但是,我无法弄清楚的是如何以更好的方式处理这些时间戳。

任何帮助将不胜感激。提前致谢。

最佳答案

我想我为你的任务找到了一个 1 行解决方案,它只使用 shell 和 awk,但请注意,它一点也不漂亮,你需要事先将 header 添加到输出文件中:

echo "TimeStamp,P1_Total,P1_High,P1_Norm,P1_Low,P2_Total,P2_High,P2_Norm,P2_Low,P3_Total,P3_High,P3_Norm,P3_Low,P4_Total,P4_High,P4_Norm,P4_Low,P5_Total,P5_High,P5_Norm,P5_Low" >> final_output.txt

for i in `seq 1 5`
do
l=$((i-1))
r=$((5-i))
awk -v left_padd=${l} -v right_padd=${r} -v nb=${i} '{gsub(/]/, "", $14)} {if ($4 ~ "Program" nb) {printf $1" "$2" "$3", "; for(a=0;a<left_padd;a++) printf "0,\t 0,\t 0,\t 0,\t "; printf $8",\t "$10",\t "$12",\t "$14",\t "; for(b=0;b<right_padd;b++) printf "0,\t 0,\t 0,\t 0,\t "; print "\n"} }' sample.log
done >> final_output.txt

*** 请注意,您必须将 seq 1 5 中的 5 更改为您希望拥有的 Program# 条目数在您的输出文件中,我使用了 5 就像您的示例中那样。此外,您还需要将 r=$((5-i)) 中的 5 更改为相同的值。

解释:

  • for 循环每次都传递文件以搜索 Program#使用 awk 输入。
  • l 变量计算它应该在左边添加多少个 0 值你的 table 。
  • r 变量与 l 值的作用相同,只是它添加了 0 个值向右。
  • nb 变量存储了 Program # 所以 awk 部分知道它应该在输入文件中查找哪些行。
  • awk 仅打印出您在输入中请求的值每个 Program# 条目以及前面和后面的文件表中其他条目的 0 值(每个 Program# 有 4 个 0)。

编辑:

我使用 \t 来分隔 awk 中的值,这样更容易阅读,但您可以删除它,这样您只有逗号分隔值。出于同样的原因,我还将标题约定从您的答案 Program#_Total 更改为 P#_Total

*我确实意识到这根本不是最佳选择,因为文件会针对每个 Program# 条目进行多次解析,而且您还需要自己在输出文件中添加 header ,但它是我能想到的最好的。

关于linux - 使用 shell 脚本从特定日志文件创建 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48822146/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com