如何用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
相关产品推荐
相关产品推荐

