У меня есть 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
command-line
sort
Kokizzu
источник
источник
| sort | uniq -c
| LC_ALL=C sort | LC_ALL=C uniq -c
uniq
может сделать это ..Ответы:
Как указано в комментариях.
Конвейер вывода в
sort
упорядочивает вывод в алфавитном / числовом порядке.Это требование, потому что
uniq
совпадает только на повторных строках, т.е.Если вы используете
uniq
этот текстовый файл, он вернет следующее:Это потому, что два
a
s разделеныb
- они не являются последовательными строками. Однако, если вы сначала отсортируете данные в алфавитном порядке, сначала какЗатем
uniq
удалите повторяющиеся строки.-c
Вариантuniq
подсчета числа копий и обеспечивает вывод в виде:Рекомендации:
sort(1)
uniq(1)
источник
printf '%s\n' ①.php ②.php | sort | uniq -c
дает мне2 ①.php
php\nphp
①.php
сортирует так же, как②.php
в моей локали, потому что порядок сортировки для тех①
и②
символов в моей локали не определен. Если вы хотите уникальные значения для всех значений байта (помните пути к файлам не обязательно текст), то вам необходимо исправить локаль C:| LC_ALL=C sort | LC_ALL=C uniq -c
.Принятый ответ почти завершен, вам может понадобиться добавить лишний
sort -nr
в конце, чтобы отсортировать результаты по наиболее часто встречающимся строкам.уникальные опции:
варианты сортировки :
В конкретном случае, если строки, которые вы сортируете, являются числами, вам нужно использовать
sort -gr
вместоsort -nr
, см. Комментарийисточник
-n
варианте.tr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txt
. Первая команда заменяет пробелы символами новой строки, что позволяет остальной части команды работать как положено.sort -gr
вместо этого решает это.-g
: сравнить по общему числовому значению (вместо-n
: сравнить по числовому значению строки).-gr
но я думаю, что результатuniq -c
будет таким, которыйsort -nr
будет работать так, как задумано-gr
работает лучше. Попробуйте эти два примера, отличающиеся только флагами g и n:echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nr
иecho "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr
. Первый сортирует неправильно, но не второй.Вы можете использовать ассоциативный массив в awk, а затем -optionally- sort :
выход:
источник