Sortir dan hitung jumlah kemunculan garis

145

Saya memiliki file Apachelog,, access.logbagaimana cara menghitung jumlah kemunculan baris dalam file itu? misalnya hasil dari cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]'is

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

hasil yang saya inginkan adalah:

3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php 
Kokizzu
sumber
25
| sort | uniq -c
Costas
3
| LC_ALL=C sort | LC_ALL=C uniq -c
Stéphane Chazelas
ah saya tidak pernah tahu itu uniqbisa melakukan itu ..
Kokizzu
Apakah Anda memiliki contoh baris di log, karena saya pikir ini semua bisa dilakukan dengan awk tanpa semua pipa.
tidak apa-apa, file log 8.1GB diproses dalam waktu sekitar 2 menit, dan selesai sekarang, tidak perlu lagi ini: 3
Kokizzu

Jawaban:

197
| sort | uniq -c

Sebagaimana dinyatakan dalam komentar.

Menyalurkan output ke sortmengatur output ke urutan abjad / numerik.

Ini adalah persyaratan karena uniqhanya cocok pada baris yang berulang, yaitu

a
b
a

Jika Anda menggunakan uniqfile teks ini, itu akan mengembalikan yang berikut:

a
b
a

Ini karena kedua as dipisahkan oleh b- mereka bukan garis berurutan. Namun jika Anda terlebih dahulu mengurutkan data menjadi urutan abjad seperti pertama

a
a
b

Kemudian uniqakan menghapus garis yang berulang. The -cpilihan untuk uniqjumlah jumlah duplikat dan menyediakan output dalam bentuk:

2 a
1 b

Referensi:

visudo
sumber
1
Selamat datang di Unix & Linux :) Jangan ragu untuk menambahkan rincian lebih lanjut ke jawaban Anda dan jelaskan mengapa dan bagaimana ini bekerja;)
John WH Smith
1
printf '%s\n' ①.php ②.php | sort | uniq -cmemberi saya2 ①.php
Stéphane Chazelas
@ StéphaneChazelas Thats karena printf mencetakphp\nphp
4
@Jidder, tidak, itu karena ①.phpjenisnya sama dengan ②.phpdi lokal saya karena tidak ada urutan penyortiran yang ditentukan untuk mereka dan karakter di lokal saya. Jika Anda ingin yang unik nilai untuk setiap nilai byte (ingat path file tidak selalu text), maka Anda harus memperbaiki lokal ke C: | LC_ALL=C sort | LC_ALL=C uniq -c.
Stéphane Chazelas
2
Untuk mengurutkan file hitungan yang dihasilkan, Anda harus mempertimbangkan untuk menambahkan "sort -nr" sebagai jawaban @ eduard-florinescu di bawah ini.
Lluís Suñol
104
[your command] | sort | uniq -c | sort -nr

Jawaban yang diterima hampir selesai Anda mungkin ingin menambahkan ekstra sort -nrdi akhir untuk mengurutkan hasil dengan garis yang paling sering muncul terlebih dahulu

opsi uniq :

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

opsi pengurutan :

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

Dalam kasus tertentu adalah garis yang Anda sortir adalah angka, Anda perlu menggunakan sort -gralih-alih sort -nr, lihat komentar

Eduard Florinescu
sumber
3
Terima kasih banyak telah memberi tahu saya tentang -nopsi.
Sigur
2
Jawaban yang bagus, inilah yang saya gunakan untuk mendapatkan wordcount keluar file dengan kalimat: tr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txt. Perintah pertama menggantikan spasi dengan baris baru, memungkinkan sisa perintah untuk bekerja seperti yang diharapkan.
Bar
2
Dengan menggunakan opsi di atas saya mendapatkan "1" sebelum "23344". Menggunakan sort -grbukan memecahkan ini. -g: bandingkan menurut nilai numerik umum (bukan -n: bandingkan menurut nilai numerik string).
Peter Jaric
@PeterJaric Tangkapan yang hebat dan sangat berguna untuk diketahui, -grtetapi saya pikir hasilnya uniq -cakan seperti yang sort -nrakan berfungsi sebagaimana dimaksud
Eduard Florinescu
3
Sebenarnya, ketika data berupa angka, -grberfungsi lebih baik. Coba dua contoh ini, hanya berbeda pada tanda g dan n: echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nrdan echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr. Jenis pertama salah, tapi bukan yang kedua.
Peter Jaric
9

Anda dapat menggunakan array asosiatif pada awk dan kemudian -optionally- sort :

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

keluaran:

1 c.php
1 d.php
2 b.php
3 a.php
Laurence R. Ugalde
sumber
Bagaimana Anda menghitung jumlah kemunculan ketika pipa mengirimkan data?
user123456