Топ-10 IP-адресов по запросам между двумя узлами

Без «действия» (, такого как -print), findбудет распечатывать каждый посещаемый файл. Именно из-за этого find -L. ( -name dest ) -prune -o -name "*.out"по-прежнему отображаются удаляемые файлы. findдолжен просмотреть файл, прежде чем он сможет оценить предоставленные вами условия.

Добавление действия -printв конец команды findдолжно помочь.

find -L. -name dest -prune -o -name "*.out" -print
0
19.12.2019, 14:48
1 ответ

Поскольку речь идет только о размере файла, концептуально все, что нужно, это

{
ssh server2 cat /path/to/access.log
cat /local/path/to/access.log
} | awk '{print $1}' | sort | uniq -c | sort -n | tail

Однако есть ряд вещей, которые можно сделать для повышения скорости.

Сначала отправьте по сети только IP-адреса, чтобы уменьшить пропускную способность.

{
ssh server2 awk '{print $1}' /path/to/access.log
cat /local/path/to/access.log
} | awk '{print $1}' | sort | uniq -c | sort -n | tail

Во-вторых, используйте преимущества хеширования awk, чтобы избавиться от необходимости сортировки. Это заменяет порядок n *lg (n )на порядок n. При этом используется ассоциативный массив с именем seenдля подсчета количества просмотров каждого IP-адреса, а в конце выводится количество и адрес.

{
ssh server2 awk '{print $1}' /path/to/access.log
cat /local/path/to/access.log
} | awk '{seen[$1]++} END {for (i in seen){print seen[i],i}}' | sort -n | tail

В-третьих, сортировка в обратном порядке, опять же для уменьшения объема данных, которые должны передаваться

{
ssh server2 awk '{print $1}' /path/to/access.log
cat /local/path/to/access.log
} | awk '{seen[$1]++} END {for (i in seen){print seen[i],i}}' | sort -rn | head

В зависимости от данных, вероятно, имеет смысл предварительно -обработать данные на удаленном веб-сервере. Массив(seenпереименован в s, чтобы не печатать ). Здесь отправляемые данные представляют собой пары счетчиков и адресов. Затем мы добавляем их локально в третьем процессе awk.

{
ssh server2 awk '{s[$1]++}END{for (i in s){print s[i],i}}' /path/to/access.log
awk '{s[$1]++}END{for (i in s){print s[i],i}}' /local/path/to/access.log
} | awk '{s[$2]+=$1}END{for (i in s){print s[i],i}}' | sort -rn | head

Конечно, не проверено.

1
28.01.2020, 02:38

Теги

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