我有一个带有以下示例数据的输入文件。
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
我想输出唯一的内核版本,并且DC正在运行哪个。
例如;
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
实现这一目标的最佳方法是什么?
我会做这样的事情:
#!/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 "$kernelt$kernels{$kernel}n"; }
警告:我没有测试此脚本。我对可能由此代码引起的任何语法错误,种族条件或Velociraptor攻击不承担任何责任。
编辑:我现在已经对其进行了测试。一个已经纠正的句法错误,没有主要的速率攻击。
这可能对您有用:
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}//'