行の出現回数のソートとカウント


145

私はApacheログファイルを持っています、access.logそのファイルの行の数を数える方法は?たとえば、結果cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]'

a.php
b.php
a.php
c.php
d.php
b.php
a.php

私が望む結果は次のとおりです。

3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php 

25
| sort | uniq -c
コスタス14年

3
| LC_ALL=C sort | LC_ALL=C uniq -c
ステファンシャゼル14年

ああ、私はそれが分からないuniqことを行うことができます。..
Kokizzu

ログに行の例を持っていますか、これはすべてのパイプなしでawkですべて実行できると思うからです。

それは大丈夫だ、8.1ギガバイトのログファイルは約2分で処理し、それは今のところ行われています、もはやもうこれは必要ありません:3
Kokizzu

回答:


196
| sort | uniq -c

コメントに記載されているとおり。

出力をパイピングするとsort、出力がアルファベット順/数字順に整理されます。

これは、uniq繰り返し行でのみ一致するため、要件です。

a
b
a

uniqこのテキストファイルで使用すると、次が返されます。

a
b
a

これは、2つaのがb-で区切られているためです。これらは連続した行ではありません。ただし、最初に次のように最初にデータをアルファベット順に並べ替える場合

a
a
b

次にuniq、繰り返し行を削除します。-cオプションuniqカウント重複の数と形で出力を提供します。

2 a
1 b

参照:


1
Unix&Linuxへようこそ:)回答に詳細を追加し、なぜこれがどのように機能するかを説明してください;)
ジョンWHスミス

1
printf '%s\n' ①.php ②.php | sort | uniq -c私を与えます2 ①.php
ステファンシャゼル14年

@StéphaneChazelasthatsはprintfが印刷されるためphp\nphp

4
@Jidder、いいえ、それは私のロケール①.phpと同じよう②.phpにソートされているからです。なぜなら私のロケールではそれらと文字のソート順が定義されていないからです。バイト値に一意の値が必要場合(ファイルパスは必ずしもテキストではないことに注意してください)、ロケールをC:に修正する必要があります| LC_ALL=C sort | LC_ALL=C uniq -c
ステファンシャゼル

2
結果のカウントファイルをソートするには、以下の@ eduard-florinescuの回答として「sort -nr」を追加することを検討する必要があります。
ルイススニョール

104
[your command] | sort | uniq -c | sort -nr

受け入れられた回答はほぼ完成sort -nrしているため、最後に余分な行を追加して、最も頻繁に出現する行で結果を並べ替えることができます。

uniqオプション:

-c, --count
       prefix lines by the number of occurrences

並べ替えオプション:

-n, --numeric-sort
       compare according to string numerical value
-r, --reverse
       reverse the result of comparisons

特定のケースでは、ソートする行が数字である場合、sort -gr代わりに使用する必要がありますsort -nrコメントを参照してください


3
-nオプションについて教えてくれてありがとう。
シグル

2
素晴らしい答え、文章でファイルからワードカウントを取得するために私が使用するものは次のとおりtr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txtです。最初のコマンドはスペースを改行で置き換え、残りのコマンドが期待どおりに機能するようにします。
バー

2
上記のオプションを使用すると、「23344」の前に「1」が表示されます。sort -gr代わりに使用すると、これが解決します。-g:一般的な数値に従って比較します(代わりに-n:文字列の数値に従って比較します)。
ピータージャリック

@PeterJaricグレートキャッチと知っていることは非常に便利-grが、私はの出力が考えるuniq -cそのようになる sort -nrことを目的として動作します
エドゥアルトFlorinescu

3
実際、データが数値の場合、-grより適切に機能します。gであり、nはフラグのみが異なる、これらの2つの例を試してみてくださいecho "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nrecho "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr。最初のものは正しくソートされませんが、2番目のものはソートされません。
ピータージャリック

9

awkで連想配列を使用してから、必要に応じてsortを実行できます

cat access.log  | awk ' { tot[$0]++ } END { for (i in tot) print tot[i],i } ' | sort

出力:

1 c.php
1 d.php
2 b.php
3 a.php

パイプがデータを送信しているときに、発生回数をどのようにカウントしますか?
user123456
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.