我有以下与多接口(数十个)网络设备有关的输入(请注意,带有#
的行仅作说明,而未出现在数据中):
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
完成吗?当然,任何澄清的问题都欢迎。
答案 0 :(得分:2)
这可能对您有用(GNU sed):
sed -E '/^#/d;/^eth/!{H;$!d};x;s/\n/ /gp;x;h;d' file
存在三种情况:以#
开头的行,以eth开头的行和其他行。
如果当前行是注释,则将其删除。
如果当前行没有以eth
开始,则将其附加到保留空间(HS)并删除它,除非它是最后一行。
否则,当前行从eth
开始或为最后一行,因此请交换到HS,如果其中包含任何换行符,请将其替换为空格并打印结果。交换回图案空间,并用当前行替换HS并删除当前行,除非它是文件的最后一行,否则将其打印出来。
答案 1 :(得分:0)
这在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>) {
...