Python 仅将日志文件汇总为唯一条目

Python 仅将日志文件汇总为唯一条目,python,perl,Python,Perl,多年来,我一直在使用这个脚本来总结日志文件 #!/usr/bin/perl $logf = '/var/log/messages.log'; @logf=( `cat $logf` ); foreach $line ( @logf ) { $line=~s/\d+/#/g; $count{$line}++; } @alpha=sort @logf; $prev = 'null'; @uniq = grep($_ ne $prev &&

多年来,我一直在使用这个脚本来总结日志文件

 #!/usr/bin/perl

 $logf = '/var/log/messages.log';

 @logf=( `cat $logf` );
 foreach $line ( @logf ) {
      $line=~s/\d+/#/g;
      $count{$line}++;
 }

 @alpha=sort @logf;
 $prev = 'null';
 @uniq = grep($_ ne $prev && ($prev = $_), @alpha);
 foreach $line (@uniq) {
      print "$count{$line}: ";
      print "$line";
 }
我想用Python重写它,但我不完全理解它的某些部分,例如:

 @alpha=sort @logf;
 $prev = 'null';
 @uniq = grep($_ ne $prev && ($prev = $_), @alpha);

有没有人知道Python模块可以消除重写这个模块的需要?我还没找到类似的东西。提前谢谢

我不得不说,我经常遇到有人试图用python做一些事情,perl可以在shell或bash上一行完成:

我不喜欢否决票,因为人们应该知道,如果可以在shell上完成的话,就没有理由在20行python中进行操作

< my_file.txt | sort | uniq > uniq_my_file.txt
uniq_my_file.txt
相当于

uniq = sorted(set(logf))
如果
logf
是行列表

但是,由于您正在计算线路的频率, 您可以使用a来计算行数和收集唯一行(作为键)(这样就完全不需要计算
uniq
):



正如var的名称所暗示的那样

@alpha=sort @logf;
$prev = 'null';
@uniq = grep($_ ne $prev && ($prev = $_), @alpha);
正在查找唯一的元素(即删除重复的行),忽略行中的数字,因为它们以前被替换为
。这三行本来可以写出来的

@uniq = sort keys(%count);
甚至可能

@uniq = keys(%count);
用Perl编写程序的另一种方法:

my $log_qfn = '/var/log/messages.log';
open(my $fh, '<', $log_qfn)
   or die("Can't open $log_qfn: $!\n");

my %counts;
while (<$fh>) {
   s/\d+/#/g;
   ++$counts{$_};
}

#for (sort keys(%counts)) {
for (keys(%counts)) {
   print "$counts{$_}: $_";
}
my$log_qfn='/var/log/messages.log';

打开(我的$fh,'你理解它的最好方法是把你不懂的位放入打印语句。
@alpha=sort@logf
将logf行排序到一个称为alpha的数组中。你应该展示一个输出示例,因为这是对日志文件进行唯一排序的,它是kill number,可能是日期。正如ikegami所说的那样It’s not equired’s not equired’s not equired’s not equired’s not equired’s not equired’s not equired’s not equired’s not equired’s not equired’s not equired’s not equired’s not equired’s not equired’s not equired’s not’s not equired’s not’s not equired’s note.这就是为什么在Op的版本中数字被ey不会打乱每行的唯一性。它们不是100%等价的-删除
\
上的
\
-还应该对uniq进行排序。就像Perl@alpha中的排序一样。@sotapme,排序对我来说似乎是一种查找唯一元素的方法,而不是一个目标,因为按计数排序可能更有意义。我刚刚运行过将每个版本相互比较以确保它们是相同的。现在它们是字节完美的!没有
\
\\它们是完美的。通常在使用日志文件时,将它们加载到内存中是不好的,因为它们可能是错误的。
@uniq = sort keys(%count);
@uniq = keys(%count);
my $log_qfn = '/var/log/messages.log';
open(my $fh, '<', $log_qfn)
   or die("Can't open $log_qfn: $!\n");

my %counts;
while (<$fh>) {
   s/\d+/#/g;
   ++$counts{$_};
}

#for (sort keys(%counts)) {
for (keys(%counts)) {
   print "$counts{$_}: $_";
}