Как сортировать по имени?

Глупо, но работает:

sed 'h;G;s/\n/&&/;s/^\(.*\)\n\(.*\)\n\1\2$/\2/'

Что это? Вы удваиваете весь контент, затем заменяете первую новую строку двумя новыми строками. Таким образом, у вас есть один и тот же контент дважды с одной дополнительной новой строкой после первой строки. Теперь с помощью обратных ссылок вы можете идентифицировать различные части.

Если вы не хотите использовать буфер удержания:

sed 's/.*/&&/;s/\n/&&/;s/^\(.*\)\n\(.*\)\1\2$/\2/'

И нет, мне это не нравится. Если есть способ избежать этого, избегайте его.

2
03.01.2021, 17:37
1 ответ

Всегда следует использовать sortперед использованием команды uniq. Способ работы uniqзаключается в том, что он подсчитывает дубликаты только в том случае, если они выстроены один за другим, если у вас есть одна и та же строка через несколько строк после нескольких разных строк, эта строка не будет учитываться как предыдущие дубликаты.

Вы всегда должны использовать sortи конвейер к uniq -c, чтобы получить точное количество одинаковых строк.

Кроме того, поскольку в первом столбце будет число отсчетов, вы должны использовать sort -n, если хотите отсортировать их по номеру вхождения.

Вы также можете удалить первую кошку и выполнить awk непосредственно в файле, а не в выводе cat.

Вы должны использовать что-то вроде этого:

gawk '$9=="404"' log.txt | gawk '{print $7, $9}' |  sort | uniq -c | sort -n

Вы также можете использовать sort -kдля сортировки по второму столбцу, если вы не хотите сортировать по номеру счетчика.

gawk '$9=="404"' log.txt | gawk '{print $7, $9}' |  sort | uniq -c | sort -k 2

Если вам не нужно подсчитывать количество строк, вы можете просто использовать sort -u для получения уникальных строк, и вы можете соединить два канала awk в один.

gawk '$9=="404" {print $7, $9}' log.txt | sort -u

Если вы хотите отсортировать по количеству вхождений и подсчитать все 404 в одной команде, вам нужно будет сделать все внутри awk примерно так:

gawk '{PROCINFO["sorted_in"] = "@val_num_asc"} $9=="404" {count_url[$7]++} {count_404[$9]++} END {for(url in count_url) print count_url[url],url;print "number of 404 errors: "count_404[404];}' log.txt
5
18.03.2021, 22:40

Теги

Похожие вопросы