6

ファイルを読み取って、特定のフィールドの出現回数で並べ替えようとしています。ログファイルから最も繰り返される日付を見つけたいと仮定し、uniq -cオプションを使用して、降順で並べ替えます。このようなもの

uniq -c | sort -nr 

これにより、次のような出力が生成されます-

809 23/Dec/2008:19:20

実際にカウントである最初のフィールドは私にとって問題です....上記の出力から日付を取得したいのですが、これを取得できません。カットコマンドを使ってみました

uniq -c | sort -nr | cut -d' ' -f2 

しかし、これは空白を印刷するだけです...誰かが日付のみを取得してカウントを切り落とすのを手伝ってくれませんか。欲しいだけ

23/Dec/2008:19:20

ありがとう

4

9 に答える 9

8

uniqカウントが 7 桁を超えない限り、カウント from の前にスペースがあるため、次のようにする必要があります。

uniq -c | sort -nr | cut -c 9-

列(文字位置)を9つ上に取得します。または、次を使用できますsed

uniq -c | sort -nr | sed 's/^.\{8\}//'

また:

uniq -c | sort -nr | sed 's/^ *[0-9]* //'

この 2 番目のオプションは、10,000,000 回以上の繰り返し回数に直面しても堅牢です。それが問題であると思われる場合は、おそらくcut代替案よりも優れています。そして、間違いなく他のオプションも利用可能です。


警告: カウントは Mac OS X 10.7.3 での実験によって決定されましたが、 8.3uniqからのGNU を使用しています。coreutilsBSDuniq -cは、1 桁のカウントの前に 3 つの先行スペースを生成しました。POSIX仕様では、からの出力uniq -cは次のようにフォーマットする必要があると述べています。

printf("%d %s", repeat_count, line);

先頭の空白はありません。このように出力形式が異なる可能性があることを考えるsedと、正規表現を使用したスクリプトは[0-9]、 からの観測出力と理論出力の変動性を処理する最も信頼できる方法ですuniq -c

uniq -c | sort -nr | sed 's/^ *[0-9]* //'
于 2012-04-10T06:33:34.250 に答える
5

の代わりにcut -d' ' -f2、試してください

awk '{$1="";print}'

最初にもう 1 つ空白を削除する必要があるかもしれません。

awk '{$1="";print}' | sed 's/^.//'

または完全に sed を使用して、元の空白を保持します。

sed -r 's/^[^0-9]*[0-9]+//'
于 2012-04-10T06:36:27.887 に答える
2

別の解決策は次のとおりです。

uniq -c | sort -nr | awk '{print $1, $2}'

また、単一のフィールドを簡単に印刷することもできます。

于 2012-08-10T22:03:46.423 に答える
1

パイプ チェーンに追加tr -sして、複数のスペースを 1 つのスペース区切り文字に「絞り込む」:

uniq -c | tr -s ' ' | cut -d ' ' -f3

trわかりにくい場所でとても役に立ちます。残念ながら、最初の先頭のスペースは取り除かれません。したがって、-f3

于 2017-01-13T16:46:34.367 に答える