2012-11-10 26 views
3

我有一個包含以下示例數據的輸入文件。uniq主機名的內核版本

KERNEL_VERSION主機名

2.6.32-220.el6.x86_64 www01.dc1.domain.com 
2.6.32-220.el6.x86_64 www02.dc1.domain.com 
2.6.32-220.el6.x86_64 exc01.dc1.domain.com 
2.6.32-220.el6.x86_64 exc02.dc1.domain.com 
2.6.32-120.el6.x86_64 www03.dc2.domain.com 
2.6.32-120.el6.x86_64 www04.dc2.domain.com 
2.6.32-120.el6.x86_64 exc03.dc2.domain.com 
2.6.32-120.el6.x86_64 exc04.dc2.domain.com 
2.6.32-100.el6.x86_64 www05.dc3.domain.com 
2.6.32-100.el6.x86_64 www06.dc3.domain.com 
2.6.32-100.el6.x86_64 exc05.dc3.domain.com 
2.6.32-100.el6.x86_64 exc06.dc3.domain.com 
2.6.32-220.el6.x86_64 www07.dc4.domain.com 
2.6.32-220.el6.x86_64 www08.dc4.domain.com 
2.6.32-220.el6.x86_64 exc07.dc4.domain.com 
2.6.32-220.el6.x86_64 exc08.dc4.domain.com 

我想輸出的唯一的內核版本,以及DCS正在運行的。

例如;

2.6.32-220.el6.x86_64 dc1, dc4 
2.6.32-120.el6.x86_64 dc2 
2.6.32-100.el6.x86_64 dc3 

什麼是最好的方法來實現這一目標?

+0

標題應該更喜歡閱讀,內核版本通過獨特的DC – PeterG

回答

1

我會做這樣的事情:

#!/usr/bin/perl 
use warnings; 
use strict; 

my %kernels; 
open INPUT,"<inputfile"; 

while (<INPUT>) 
{ 
    my ($version, $hostname) = split(/\s+/,$_); 
    if ($kernels{$version}) { $kernels{$version} .= ", $hostname" } 
    else { $kernels{$version} = $hostname } 
} 
close INPUT;  

# Print the summary 
foreach my $kernel (keys(%kernels)) { print "$kernel\t$kernels{$kernel}\n"; } 

警告:我沒有測試這個腳本。我不會對任何語法錯誤,競爭條件,或迅猛的攻擊可以通過這個代碼引起的..但它應該讓你開始

編輯:我現在已經進行了測試。一個已經糾正的語法錯誤,並且沒有重大的迅速襲擊。

+0

是否正如它在錫上所說的那樣。謝謝! – PeterG

+0

from commandline:'perl -ne {$ 2} ++ if /(\S+)\s[^.]+\.([^.]+)\./;END {map {printf「%s%s \ n」,$ _,join(「,」,keys%{$ str {$ _}}); } keys%str;}'' –

1

這可能會爲你工作:

sed 's/ [^\.]*\.\([^.]*\).*/ \1/' file | 
sort -u | 
sed ':a;$!N;s/^\(\(.*\) .*\)\n.*\2/\1,/;ta;P;D' 

這給出結果,但不是在原來的順序,對原來的順序使用:

sed 's/ [^\.]*\.\([^.]*\).*/ \1/' file | 
cat -n - | 
sort -uk2,3 | 
sed ':a;$!N;s/^\(.\{7\}\(.*\) .*\)\n.*\2/\1,/;ta;P;D' | 
sort -n | 
sed 's/^.\{7\}//' 
+0

很好,很好! (條件'$!'似乎不是必須的,因爲'P; D' as sed將會打印每一行:第二個sed可能更簡單:':a; N; s/^ \(。* \)\ (。* \)\ n \ 1 \ \ 1 \ 2,/; ta') –

+0

@ F.Hauri當收集到2個或更多'dc'時,'P; D'是必要的,因爲'N'附加下一個記錄,然後這可能有一個'dc'收集等''!!N'雖然沒有必要所有的seds在邏輯上是正確的,是一個全面的條件。 – potong