从列中解析文本

BDN*_*BDN 3 linux grep sed awk

2018-05-24 23:57:30 1.1.1.1 8.8.4.4
2018-05-24 23:57:32 2.2.2.2 8.8.4.4
2018-05-24 23:58:12 8.8.8.8 8.8.4.4
2018-05-24 23:58:23 8.8.8.8 8.8.4.4
2018-05-24 23:59:40 8.8.8.8 8.8.4.4
2018-05-24 23:59:51 8.8.8.8 8.8.4.4
Run Code Online (Sandbox Code Playgroud)

因为我有上述格式的日志文件。现在我需要解析它,输出应该如下所示(如果行数据重复,则通过比较第 3 列和第 4 列只显示第一行和最后一行。

2018-05-24 23:57:30 1.1.1.1 8.8.4.4
2018-05-24 23:57:32 2.2.2.2 8.8.4.4
2018-05-24 23:58:12 8.8.8.8 8.8.4.4
2018-05-24 23:59:51 8.8.8.8 8.8.4.4
Run Code Online (Sandbox Code Playgroud)

cho*_*oba 6

Perl 来拯救:

perl -ane '
    if ($F[2] ne $c3 || $F[3] ne $c4) {
        $printed or print $previous;
        $printed = print;
    } else {
        $printed = 0;
    }
    ($c3, $c4, $previous) = (@F[2, 3], $_);
    END { print $previous unless $printed }
' -- input.file
Run Code Online (Sandbox Code Playgroud)
  • -n 逐行读取输入并为每一行运行代码。
  • -a 将空格上的每个输入行拆分为 @F 数组。
  • $c3 和 $c4 用于保留第 3 列和第 4 列的先前值,实际值存储在 $F[2] 和 $F[3] 中(数组从 0 开始索引)。
  • $previous 存储前一行,以防我们需要打印它。
  • $printed 只是防止将最后一行打印两次(如果第 3 列和第 4 列与前一行不同,则会发生这种情况)。