我有以下输入,涉及多接口(几十个)网络设备(请注意,#
的行仅用于说明而不存在于数据中):
eth<number1>
# eth as pattern is fine, running number will be dealt with
parameter1 parameter2 parameter3...parameterN
#ellipsis means and so on and is not literal
parameter21 parameter22
parameter31 parameter32 parameter33 parameter34
parameter41
eth<number2>
parameter1 parameter2
parameter21
.
.
.
.
parameterN1 parameterN2
# again, vertical ellipsis is not literal and means simply that rows
# with parameters can go on and on, it is not known in advance for
# how long
eth<number3>
parameter1 parameter2
eth<number4>
parameter1 parameter2
parameter21
所需的输出应如下所示:
eth<number1> parameter1 parameter2 parameterN parameter21 parameter22 parameter31 parameter32 parameter33 parameter34 parameter41
# all in one line, with as many columns as there are parameters for
# the given interface.
eth<number2> parameter1 parameter2....parameterNM
eth<number3> parameter1 parameter2
eth<number4> parameter1 parameter2 parameter21
任何想法如何用awk
或sed
完成它?当然,欢迎提出任何澄清问题。
这可能适合你(GNU sed):
sed -E '/^#/d;/^eth/!{H;$!d};x;s/\n/ /gp;x;h;d' file
有三种情况:以#
开头的行,以及以eth开头的行和其他行。
如果当前行是注释,请将其删除。
如果当前行没有开始eth
,请将其附加到保留空间(HS)并删除它,除非它是最后一行。
否则,当前行开始eth
或是最后一行,因此交换到HS,如果包含任何换行符,请用空格替换它们并打印结果。交换回模式空间并用当前行替换HS并删除当前行,除非它是文件的最后一行,在这种情况下打印它。
这在Perl中应该很容易实现。 eth
线很容易匹配,我们只想将它们之间的所有线组合成一条线。
#!/usr/bin/env perl
use strict;
use warnings;
my $collected;
while (my $line = <DATA>){
next if $line =~ /^#/;
if($line =~ /^eth/) {
# new block of lines
if ($collected) {
print $collected, "\n";
$collected = "";
}
chomp $line;
$collected = $line;
} else {
# Append to collected lines
chomp $line;
$collected = "$collected $line";
}
}
print $collected,"\n" if $collected;
__DATA__
eth<number1>
parameter1 parameter2 parameter3...parameterN
#ellipsis means and so on and is not literal
parameter21 parameter22
parameter31 parameter32 parameter33 parameter34
parameter41
eth<number2>
parameter1 parameter2
parameter21
parameterN1 parameterN2
eth<number3>
parameter1 parameter2
eth<number4>
parameter1 parameter2
parameter21
这将解析您的示例数据(忽略注释)并创建所需的输出。当然,这只是一个演示;你想要open
数据所在的文件并阅读它:
open my $fh, "<", "your.data" or die "Can't open file: $!\n";
...
while(my $line = <$fh>) {
...