Saya memiliki file Apache
log,, access.log
bagaimana 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
command-line
sort
Kokizzu
sumber
sumber
| sort | uniq -c
| LC_ALL=C sort | LC_ALL=C uniq -c
uniq
bisa melakukan itu ..Jawaban:
Sebagaimana dinyatakan dalam komentar.
Menyalurkan output ke
sort
mengatur output ke urutan abjad / numerik.Ini adalah persyaratan karena
uniq
hanya cocok pada baris yang berulang, yaituJika Anda menggunakan
uniq
file teks ini, itu akan mengembalikan yang berikut:Ini karena kedua
a
s dipisahkan olehb
- mereka bukan garis berurutan. Namun jika Anda terlebih dahulu mengurutkan data menjadi urutan abjad seperti pertamaKemudian
uniq
akan menghapus garis yang berulang. The-c
pilihan untukuniq
jumlah jumlah duplikat dan menyediakan output dalam bentuk:Referensi:
sort(1)
uniq(1)
sumber
printf '%s\n' ①.php ②.php | sort | uniq -c
memberi saya2 ①.php
php\nphp
①.php
jenisnya sama dengan②.php
di 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
.Jawaban yang diterima hampir selesai Anda mungkin ingin menambahkan ekstra
sort -nr
di akhir untuk mengurutkan hasil dengan garis yang paling sering muncul terlebih dahuluopsi uniq :
opsi pengurutan :
Dalam kasus tertentu adalah garis yang Anda sortir adalah angka, Anda perlu menggunakan
sort -gr
alih-alihsort -nr
, lihat komentarsumber
-n
opsi.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.sort -gr
bukan memecahkan ini.-g
: bandingkan menurut nilai numerik umum (bukan-n
: bandingkan menurut nilai numerik string).-gr
tetapi saya pikir hasilnyauniq -c
akan seperti yangsort -nr
akan berfungsi sebagaimana dimaksud-gr
berfungsi lebih baik. Coba dua contoh ini, hanya berbeda pada tanda g dan n:echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nr
danecho "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr
. Jenis pertama salah, tapi bukan yang kedua.Anda dapat menggunakan array asosiatif pada awk dan kemudian -optionally- sort :
keluaran:
sumber