我正在尝试将一些垃圾收集日志放入 Splunk。但是,当 Java 启动垃圾收集时,它会启动日志条目,然后在完成后将其放在条目的末尾。Splunk 将这些视为单独的条目,因此我尝试使用 cron 将日志输入到单独的文件中,并让 Splunk 监视该文件。
我发现不完整的日志条目没有换行符,所以我一直尝试使用 grep、sed 或 perl 单行程序来过滤掉这些条目。
我试过这些
cat <log file> | egrep "\n"
cat <log file> | sed '/\n/p'
perl -pe '/(?:\n|\r)+$/gm' <log file>
但是,每次我都得到不完整的行(你可以在第三行末尾看到我的提示):
2013-10-11T13:21:43.952-0500: 56511.609: [GC 56511.609: [ParNew: 2457856K->271659K(2765056K), 0.5481470 secs] 5897437K->3711241K(11981056K), 0.5485080 secs] [Times: user=1.21 sys=0.00, real=0.55 secs]
2013-10-11T13:53:17.001-0500: 58404.658: [GC 58404.658: [ParNew: 2729515K->180830K(2765056K), 0.4755270 secs] 6169097K->3747097K(11981056K), 0.4758900 secs] [Times: user=1.29 sys=0.01, real=0.48 secs]
2013-10-11T14:02:56.084-0500: 58983.741: [Full GC (System) 58983.741: [CMS: 3566266K->3504629K(9216000K), 12.7932340 secs] 4444704K->3504629K(11981056K), [CMS Perm : 2082967K->2081438K(3393452K)], 12.7937180 secs][user@host ~]$
我应该使用什么方法来仅匹配以换行符 (\n) 结尾的行?或者还有其他方法可以做到这一点?
答案1
你可以通过以下方式实现你想要的:
perl -ne 'print if /\n/' <log file>
例子:
[root@ach tmp]# xxd ble
0000000: 610a 620a 630a 64 a.b.c.d
[root@ach tmp]# perl -ne 'print if /\n/' ble
a
b
c
[root@ach tmp]#
您的 perl 代码无法工作,因为 -p 使 perl 打印每一行(以 \n 或文件结尾字符终止)。您进行了一些正则表达式匹配,但它不会影响任何东西。
perl -pe '/(?:\n|\r)+$/gm' <log file>