2

私はこのスクリプトを何年もの間、ログファイルを要約するために使用しています。

 #!/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モジュールを知っている人はいますか?似たようなものを見つけることができませんでした。前もって感謝します!

4

3 に答える 3

3

変数の名前が示すように、

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

一意の要素を見つけます (つまり、重複する行を削除します)。行内の番号は、以前に に置き換えられたため無視され#ます。それらの3行は書かれている可能性があります

@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{$_}: $_";
}

これを Python に変換するのは簡単です。

于 2013-02-10T01:13:46.207 に答える
2
 @alpha=sort @logf;
 $prev = 'null';
 @uniq = grep($_ ne $prev && ($prev = $_), @alpha);

と同等です

uniq = sorted(set(logf))

logf行のリストである場合。

ただし、行の頻度をカウントしているため、collections.Counterを使用して、行をカウントし、一意の行を (キーとして) 収集することができます (したがって、計算する必要がuniqまったくなくなります)。

count = collections.Counter()
for line in f:
    count[line] += 1

import sys
import re
import collections

logf = '/var/log/messages.log'
count = collections.Counter()
write = sys.stdout.write

with open(logf, 'r') as f:
    for line in f:
        line = re.sub(r'\d+','#',line)
        count[line] += 1

for line in sorted(count):
     write("{c}: {l}".format(c = count[line], l = line))
于 2013-02-10T01:07:49.627 に答える
1

私は、シェルまたはbashで1行で実行できるpython perlで何かをしようとしている人によく遭遇したと言わざるを得ません。

シェルで実行できる場合、20行のPythonで何かを実行する理由がないことを人々が知っている必要があるため、反対票は気にしません

< my_file.txt | sort | uniq > uniq_my_file.txt
于 2013-02-10T00:57:37.620 に答える