You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Perl单行命令从Apache PySpark日志提取多表格数据

用Perl单行命令拆分Spark日志中的多个独立表格

Spark日志里的输出表格通常以+----+----+格式的分隔线开头和结尾,当日志存在多个这类表格时,常规的Perl范围匹配(/起始/ .. /结束/)会因贪婪特性,把从第一个表格开头到最后一个表格结尾的所有内容一次性提取,无法拆分出独立表格。下面是两种可行的解决方法:

方法一:缓冲区分段收集表格

perl -ne 'BEGIN { $buf = "" } if (/^\+-+\+/) { if ($buf ne "") { print "$buf\n"; $buf = "" } } $buf .= $_ if /^\+-+\+/ .. /^\+-+\+/; END { print $buf if $buf ne "" }' spark.log

逻辑说明:

  • 初始化空缓冲区$buf暂存单个表格内容
  • 每当遇到表格起始分隔线^\+-+\+时,若缓冲区已有内容,说明前一个表格收集完成,打印缓冲区并清空
  • 用范围匹配/^\+-+\+/ .. /^\+-+\+/,将当前表格的所有行追加到缓冲区
  • 脚本结束时,打印最后一个表格的缓冲区内容

方法二:段落模式+非贪婪匹配

perl -00 -ne 'print "$_\n" if /^\+-+\+.*?^\+-+\+/s' spark.log

逻辑说明:

  • -00启用Perl段落模式,将输入按空行分割为独立段落
  • /s修饰符让正则中的.可以匹配换行符
  • .*?是非贪婪匹配,确保只捕获从当前表格起始分隔线到最近结束分隔线的内容,不会跨表格匹配

测试示例

假设日志包含如下内容:

2024-05-20 10:00:00 INFO SparkContext:54 - Starting job...
+---+-----+
| id | name|
+---+-----+
| 1 | Alice|
| 2 | Bob |
+---+-----+
2024-05-20 10:00:05 INFO DAGScheduler:54 - Job finished
+---+-------+
| uid | score|
+---+-------+
| 101 | 95 |
| 102 | 88 |
+---+-------+
2024-05-20 10:00:10 INFO SparkContext:54 - Another job...
+---+--------+
| pid | status |
+---+--------+
| 201 | success|
| 202 | failed |
+---+--------+

使用上述任意命令,都会输出三个独立表格,每个表格间以空行分隔,不会包含日志中的非表格内容。

内容的提问来源于stack exchange,提问作者stack0114106

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:42:34