Rod*_*der 2 bash logging file-manipulation
我有一个日志文件,其中包含各个线程的执行开始时间和结束时间。我已经完成了一半的工作,但我需要一些帮助来完成另一半。我写了这个命令 -
cat 2017-05-15.log | grep 'Executing ETL' | tr -s ' ' | cut -f2,3,4,5,8 -d' ' | sort -k5 -n
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
15 May 2017 03:43:40 696
15 May 2017 03:44:35 696
15 May 2017 03:45:02 696
15 May 2017 23:30:22 9502
15 May 2017 23:49:40 9502
15 May 2017 23:50:50 9502
15 May 2017 23:51:11 9502
15 May 2017 23:52:11 9502
15 May 2017 23:52:42 9502
15 May 2017 02:18:32 12795
15 May 2017 02:19:35 12795
15 May 2017 02:20:02 12795
15 May 2017 02:33:39 13674
15 May 2017 02:35:13 13674
15 May 2017 02:35:42 13674
15 May 2017 18:52:28 19143
15 May 2017 18:53:01 19143
15 May 2017 18:53:35 19143
15 May 2017 18:53:59 19143
15 May 2017 18:54:40 19143
Run Code Online (Sandbox Code Playgroud)
此输出按进程 ID(最后一列)排序。每个进程 ID 第一次出现是该进程的开始时间,最后一次出现是该进程的结束时间。我只需要显示每个进程的第一个(开始时间)和最后一个(结束时间)。像这样:
15 May 2017 03:43:40 696
15 May 2017 03:45:02 696
15 May 2017 23:30:22 9502
15 May 2017 23:52:42 9502
15 May 2017 02:18:32 12795
15 May 2017 02:20:02 12795
15 May 2017 02:33:39 13674
15 May 2017 02:35:42 13674
15 May 2017 18:52:28 19143
15 May 2017 18:54:40 19143
Run Code Online (Sandbox Code Playgroud)
每个进程 ID 的条目数不固定。输出不必严格采用这种格式。但我需要能够清楚地看到每个进程的开始和结束时间。
如果 PID 永远不会混淆,那么这相当简单。我们只跟踪最后一行及其 PID,并在看到更改时打印最后一行和当前行。(如果last为空则跳过打印,否则我们会得到一个空行作为开头,并记住在 处打印最后一行END。)
$ awk '($5 != lastpid) { if (last) print last; print $0; }
{ lastpid = $5; last = $0 }
END {print last }' < times
15 May 2017 03:43:40 696
15 May 2017 03:45:02 696
15 May 2017 23:30:22 9502
15 May 2017 23:52:42 9502
15 May 2017 02:18:32 12795
15 May 2017 02:20:02 12795
15 May 2017 02:33:39 13674
15 May 2017 02:35:42 13674
15 May 2017 18:52:28 19143
15 May 2017 18:54:40 19143
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
910 次 |
| 最近记录: |