Mam plik Apache
dziennika, access.log
jak policzyć liczbę wystąpień linii w tym pliku? na przykład wynikiem cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]'
jest
a.php
b.php
a.php
c.php
d.php
b.php
a.php
wynik, który chcę to:
3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php
command-line
sort
Kokizzu
źródło
źródło
| sort | uniq -c
| LC_ALL=C sort | LC_ALL=C uniq -c
uniq
może zrobić ...Odpowiedzi:
Jak stwierdzono w komentarzach.
Pipingowanie danych wyjściowych w
sort
porządkuje dane wyjściowe w kolejności alfabetycznej / numerycznej.Jest to wymagane, ponieważ
uniq
pasuje tylko do powtarzających się linii, tjJeśli użyjesz
uniq
tego pliku tekstowego, zwróci on:Jest tak, ponieważ dwa
a
s są oddzielone znakiemb
- nie są to kolejne wiersze. Jeśli jednak najpierw posortujesz dane w kolejności alfabetycznej, npNastępnie
uniq
usunie powtarzające się linie.-c
Opcjauniq
zlicza liczbę powtórzeń i zapewnia wyjście w postaci:Bibliografia:
sort(1)
uniq(1)
źródło
printf '%s\n' ①.php ②.php | sort | uniq -c
daje mi2 ①.php
php\nphp
①.php
sortuje się tak samo jak②.php
w moim locale, ponieważ nie zdefiniowano kolejności sortowania dla tych①
i②
znaków w moim locale. Jeśli chcesz unikatowe wartości dla żadnej wartości bajtów (pamiętaj ścieżki plików niekoniecznie tekst), następnie trzeba naprawić locale C:| LC_ALL=C sort | LC_ALL=C uniq -c
.Akceptowana odpowiedź jest prawie kompletna, możesz dodać
sort -nr
na końcu dodatkowy, aby posortować wyniki według linii, które występują najczęściej jako pierwszeopcje uniq :
opcje sortowania :
W konkretnym przypadku, gdy sortowane linie są liczbami, musisz użyć
sort -gr
zamiastsort -nr
, patrz komentarzźródło
-n
opcji.tr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txt
. Pierwsze polecenie zastępuje spacje nowymi wierszami, pozwalając na to, aby reszta polecenia działała zgodnie z oczekiwaniami.sort -gr
zamiast tego rozwiązuje to.-g
: porównaj według ogólnej wartości liczbowej (zamiast-n
: porównaj według wartości liczbowej ciągu).-gr
ale myślę, że wynikuniq -c
będzie taki, żesort -nr
będzie działał zgodnie z przeznaczeniem-gr
działa lepiej. Wypróbuj te dwa przykłady, różniące się tylko flagami g i n:echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nr
iecho "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr
. Pierwszy sortuje niepoprawnie, ale nie drugi.Możesz użyć tablicy asocjacyjnej na awk, a następnie - opcjonalnie - posortować :
wynik:
źródło