LInux sort / uniq apache log - PullRequest
       9

LInux sort / uniq apache log

1 голос
/ 03 мая 2011

У меня небольшой файл (100) строк веб-запроса (формат Apache STD), есть несколько запросов от клиентов. Я хочу иметь ТОЛЬКО список запросов (строк) в моем файле, который приходит с УНИКАЛЬНОГО IP и является последней записью

У меня пока / home / $: cat all.txt | awk '{print $ 1}' | сортировать -u | "{распечатать всю строку ??}"

Выше приведены IP-адреса (около 30, что правильно), теперь мне нужно также получить остаток строки (запрос).

Ответы [ 3 ]

0 голосов
/ 03 мая 2011

Используйте ассоциативный массив для отслеживания того, какие IP-адреса вы уже нашли:

awk '{  
  if (!found[$1]) {
    print;
    found[$1]=1;
  }
}' all.txt

При этом будет напечатана первая строка для каждого IP-адреса.Если вы хотите последний, то:

awk '
     { found[$1] = $0 }
     END {
       for (ip in found)
         print found[ip]
     }
' all.txt
0 голосов
/ 03 мая 2011

Должно работать следующее:

tac access.log | sort -f -k1,1 -us

Это берет файл в обратном порядке и делает устойчивую сортировку, используя первое поле, сохраняя только уникальные элементы.

0 голосов
/ 03 мая 2011

Я ненавижу, что уникальные не имеют те же параметры, что и сортировка, или что сортировка не может делать то, что говорит, я считаю, что должно работать [1],

tac access.log | sort -fb -k1V -u

но, увы, это не так;

Поэтому, кажется, мы застряли на чем-то глупом, как

cat all.txt | awk '{ print $1}' | sort -u | while read ip
do
    tac all.txt | grep "^$ip" -h | head -1
done

Что на самом деле неэффективно, но «работает» (еще не проверял: опечатки модуля)

[1] в соответствии с man-страницей

...