Глупо, но работает:
sed 'h;G;s/\n/&&/;s/^\(.*\)\n\(.*\)\n\1\2$/\2/'
Что это? Вы удваиваете весь контент, затем заменяете первую новую строку двумя новыми строками. Таким образом, у вас есть один и тот же контент дважды с одной дополнительной новой строкой после первой строки. Теперь с помощью обратных ссылок вы можете идентифицировать различные части.
Если вы не хотите использовать буфер удержания:
sed 's/.*/&&/;s/\n/&&/;s/^\(.*\)\n\(.*\)\1\2$/\2/'
И нет, мне это не нравится. Если есть способ избежать этого, избегайте его.
Всегда следует использовать 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