如何根据列值将我的日志文件拆分为多个日志文件?

如何根据列值将我的日志文件拆分为多个日志文件?

我的连接日志文件结构如下:

主机名 方向 时间戳 bps

这是我的日志文件的片段:

www.youtube.com DOWNLOAD 1479897661131903 23508910
www.youtube.com UPLOAD 1479897661131922 735
fonts.gstatic.com DOWNLOAD 1479897660289990 527
ssl.gstatic.com UPLOAD 1479897660152435 2094
fonts.gstatic.com DOWNLOAD 1479897660290973 6662177

我想根据时间戳和主机名对其进行排序:我尝试过

sort -k 3 -o sortedTimestamps.log connectionLog.txt

结果是

ssl.gstatic.com UPLOAD     1479897660152435 2094
fonts.gstatic.com DOWNLOAD 1479897660289990 527
fonts.gstatic.com DOWNLOAD 1479897660290973 6662177
www.youtube.com DOWNLOAD   1479897661131903 23508910
www.youtube.com UPLOAD     1479897661131922 735

现在,这只是一个示例:行数越来越多,目前,sort日志文件只是按时间戳排序。由于我需要绘制此图,因此我希望根据hostname和拥有不同的日志文件direction,其中包含timestampbps

最终结果是每个都有一个日志文件hostname

www.youtube.com_DOWNLOAD_log,

www.youtube.com_UPLOAD_log,

fonts.gstatic.com_DOWNLOAD_log,

fonts.gstatic.com_UPLOAD_log

等等;每个日志文件应仅包含两列,已排序timestamp及其相应的bps.

例如:www.youtube.com_DOWNLOAD_log包含:

timestamp1 bps1
timestamp2 bps2
timestamp3 bps3
...

将其绘制在图表上,X 轴为timestamp,Y 轴为bps。我会将它们全部绘制在一起,看看bps不同连接的时间如何变化。

PS:这是我第一次尝试可视化数据,因此可能有一种更智能的方法来绘制像我的结构一样的日志文件,但由于这里的问题应该回答而不是讨论,请帮助我将我的日志文件拆分为多个日志文件,每个主机名方向一个。

编辑(2):感谢 Kalavan,这是我的脚本:

哦,管子!哦,Bash 的力量!我喜欢它!这是我的完整脚本:

#!/bin/bash

echo -e "\nCleaning previous log files...\n"
rm *.log

# File name: HOSTNAME_DIRECTION.log

sort -k1 -k3n connectionLog.txt | awk '{print $3 " " $8 >> $1"_"$2".log"}'

to_plot_upload_files="plot "
to_plot_download_files=" plot "

for file in $(ls *UPLOAD.log); do
    to_plot_upload_files="$to_plot_upload_files \"$file\" using 1:2 with lines, "
done

for file in $(ls *DOWNLOAD.log); do
    to_plot_download_files="$to_plot_download_files \"$file\" using 1:2 with lines, "
done

echo $to_plot_upload_files | gnuplot -persist
echo $to_plot_download_files | gnuplot -persist

答案1

对于初学者来说,尝试这样的事情。如果适合您,您可以进一步调整它:

sort -k1 -k3n connectionLog.txt | awk '{print $1 " " $3 " " $4 >> $1".log"}'

编辑:

我错过了您不希望日志中包含主机名。省略打印第一个字段 ($1)。

相关内容