7

grepタイムスタンプを使用してカウントするにはどうすればよいですか?

xyz例:毎回値を検索するファイルがあるとします。ファイルは定期的に更新されます。

20121912-07:15:55 abc cbfr xyz
20121912-07:16:40 mni cbfr xyz
-----------
-----------
-----------


20121912-08:15:55 gty cbfr xyz
20121912-08:20:55 jui uio xyz

この場合はxyzafterの発生を調べたいです。20121912-08:15:552

agrep -c "xyz" filenameを実行すると、ファイル全体が読み取られ、結果が得られます。最後の更新後またはタイムスタンプを使用して実行したい。

4

6 に答える 6

2

このワンライナーを試してください:

awk '$NF=="xyz"&&$1>="20121912-08:15:55"{x++;}END{print x}' file
于 2012-12-19T15:26:39.950 に答える
1

これは一種のハックですがgrep、必要な最も早い日付のみを使用して、その後のすべての行を出力し-A、次にパイプしgrep -c xyzます:

$ fgrep -A 100 '20121912-08:15:55' file | fgrep -c 'xyz'
2

注:パターンを使用していないため、fgrep固定文字列にすぎません。実行するのと同じです.grepregexgrep -F

日付からすべての行を印刷するために使用するハックの少ない方法であるため、この方法では、値がファイルの長さをカバーsedすることを確認する必要はありません。-A

$ sed -n '/20121912-08:15:55/,$p' file | fgrep -c 'xyz'
2

もちろん、そうでない場合は、ファイルがタイムスタンプでソートされていると想定しています。

$ sort file | sed -n '/20121912-08:15:55/,$p' | fgrep -c 'xyz'
2
于 2012-12-19T15:24:58.950 に答える
1

範囲 (開始点と終了点) を指定してファイルから行を出力するように sed に指示できます。範囲は正規表現または行番号表記にすることができます。

あなたの必要性のために、これはそれを行うべきです:

$ sed -n '/20121912-08:15:55/,$p' input.txt | grep -c xyz

ここで、始点は日付で与えられ、正規表現として扱われ、終点は最後の行記号$です。p指定された範囲内の行を印刷するようにsedに指示します。-nsedのオプションは、処理中の行を印刷しないように指示します。

于 2012-12-19T15:56:41.553 に答える
1

ケントの答えからインスピレーションを得て、奇数のタイムスタンプを YYYYMMDD 形式に操作する Perl を次に示します。

ts="20121912-08:15:55" patt="xyz" perl -lane  '
    BEGIN {
        ($wanted_ts = $ENV{ts}) =~ s/^(....)(..)(..)/$1$3$2/;
        $pattern = qr{$ENV{patt}};
    }
    ($this_ts = $F[0]) =~ s/^(....)(..)(..)/$1$3$2/;
    $count++ if $this_ts ge $wanted_ts and /$pattern/;
    END {print $count}
'
于 2012-12-19T19:52:40.093 に答える
0

うーん、すぐに書いたもの:

 grep xyz filename | sed -r 's/^([^ ]+).*/ 20121912-08:15:55 <= \1/' | sed -r 's/([0-9]{4})([0-9]{2})([0-9]{2})/\1\3\2/g' | sed 's/[-:]//g' | bc | grep 1 | wc -l

それはかなり醜いです(私はsedでもコマンドラインのマスターでもありません)、おそらく短縮されるかもしれませんが、それはそれを行う方法です. 以下の説明:

  grep xyz filename                                  //gets all interseting lines
| sed -r 's/^([^ ]+).*/ 20121912-08:15:55 <= \1/'    //transform them into 
                                                       //comparison with the 
                                                       //date you want
| sed -r 's/([0-9]{4})([0-9]{2})([0-9]{2})/\1\3\2/g' //invert day and month
| sed 's/[-:]//g'                                    //remove separators
| bc                                                 //ask bc result 
| grep 1                                             //get true results only
| wc -l                                              //and finally count them

あなたの例の最後の行では、手順は次のようになります:

20121912-08:20:55 jui uio xyz                  //grep 'xyz'
20121912-08:15:55 <= 20121912-08:20:55         //sed
20121219-08:15:55 <= 20121219-08:20:55         
20121219081555 <= 20121219082055               
1                                              //result from bc

HTH

于 2012-12-19T16:19:27.557 に答える