合并第n + 1行到第n行

时间:2018-06-13 11:11:10

标签: linux shell awk scripting

iostat可以显示持久性设备名称(使用-j id)而不是内核设备名称(例如sda),但这也暗示了“人类可读”输出的选项-h。 这会产生这样的输出(包含持久磁盘名称的行,例如HOMES或DATADISK,下一行包含该磁盘的值)。

(在我的例子中,我将iostat的输出传输到awk'// {print strftime(“%Y-%m-%d%H:%M:%S”),$ 0}'以获得时间戳每一行的开头):

2018-06-13 11:57:03 HOMES
2018-06-13 11:57:03                   0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    1.00    0.00    1.00   1.00   0.05
2018-06-13 11:57:03 ARCHIVEDISK
2018-06-13 11:57:03                   0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:03 DATADISK
2018-06-13 11:57:03                   0.00     0.00   86.00    0.50   680.00     2.00    15.77     0.12    1.40    1.41    1.00   1.26  10.90
2018-06-13 11:57:05 HOMES
2018-06-13 11:57:05                   0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:05 ARCHIVEDISK
2018-06-13 11:57:05                   0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:05 DATADISK
2018-06-13 11:57:05                   0.00     0.00  122.00  116.00   976.00  1164.00    17.98     0.56    2.33    3.36    1.26   1.47  34.90

我如何合并这些行,所以我得到了这个:

2018-06-13 11:57:03 HOMES             0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    1.00    0.00    1.00   1.00   0.05
2018-06-13 11:57:03 ARCHIVEDISK       0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:03 DATADISK          0.00     0.00   86.00    0.50   680.00     2.00    15.77     0.12    1.40    1.41    1.00   1.26  10.90
2018-06-13 11:57:05 HOMES             0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:05 ARCHIVEDISK       0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:05 DATADISK          0.00     0.00  122.00  116.00   976.00  1164.00    17.98     0.56    2.33    3.36    1.26   1.47  34.90

4 个答案:

答案 0 :(得分:1)

Perl救援:

perl -pe 'if ($. % 2) {
    chomp;
    $l = length;
} else {
    s/^.{19} */" " x (38 - $l)/e;
}' -- file
  • $.包含输入行号
  • %是模运算符,即$. % 2对于第1,3,5,7等行返回true。
  • /es///替换的替换部分解释为代码,此处重复空格38 - $l次,其中$l是前一行的长度(对齐)数字)

答案 1 :(得分:1)

awk,保持间距:

awk '
    NR % 2 {label = $3; next}
    {print substr($0, 1, 19), label, substr($0, 22 + length(label))}
' file

答案 2 :(得分:0)

使用awk:

awk 'NF==3{n=$3;next}{for(i=NF;i>2;i--) $(i+1)=$i;$3=n}1' file | column -t

如果该行包含3个元素,awk脚本将获取名称。 对于所有其他行,它将所有元素移动一个位置,除了前两个位置。 最后打印出这条线。

命令column正在重新格式化以显示每列。

答案 3 :(得分:0)

如果iostat输出看起来像这样:

$ cat file
HOMES
                  0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    1.00    0.00    1.00   1.00   0.05
ARCHIVEDISK
                  0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
DATADISK
                  0.00     0.00   86.00    0.50   680.00     2.00    15.77     0.12    1.40    1.41    1.00   1.26  10.90
HOMES
                  0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
ARCHIVEDISK
                  0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
DATADISK
                  0.00     0.00  122.00  116.00   976.00  1164.00    17.98     0.56    2.33    3.36    1.26   1.47  34.90

那么您只需要一个小的,简单的awk命令(使用cat file代替下面的iostat):

$ cat file | awk 'NR%2{dev=$0; next} {printf "%s %-18s %s\n", strftime("%F %T"), dev, substr($0,19)}'
2018-06-22 10:34:09 HOMES              0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    1.00    0.00    1.00   1.00   0.05
2018-06-22 10:34:09 ARCHIVEDISK        0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-22 10:34:09 DATADISK           0.00     0.00   86.00    0.50   680.00     2.00    15.77     0.12    1.40    1.41    1.00   1.26  10.90
2018-06-22 10:34:09 HOMES              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-22 10:34:09 ARCHIVEDISK        0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-22 10:34:09 DATADISK           0.00     0.00  122.00  116.00   976.00  1164.00    17.98     0.56    2.33    3.36    1.26   1.47  34.90

无需添加时间戳然后再次将其删除,不必要地调用strftime,遍历字段,管道,对“列”的调用(这些操作会破坏您的原始对齐方式等)。