Как я могу посчитать строки в файле

Ответы @derobert охватывают несколько различных вариантов. В итоге я использовал что-то вроде его нет. 3, но я расскажу об этом подробнее.

В соответствии с подходом, описанным в Перемещение логического тома из одной группы томов в другую , я скопировал несколько логических томов, содержащих существующую систему Debian 9, используя BIOS, на несколько новых дисков, которые я купил. Я также сделал новую, с нуля, установку UEFI Debian 9 на эти диски.

Тогда проблема заключалась в том, как получить копию моей системы на этих дисках для загрузки. Так получилось, что я смог использовать загрузочное меню GRUB из новой/из -нуля/установки UEFI. Когда я нажал eв пункте меню GRUB для новой установки, я смог изменить имена устройств в сценарии GRUB на имена скопированных LV, используя форму (lvm/debian-root), где debian— имя устройства. группа томов, а root— имя логического тома. Таким образом, я смог загрузить копию моей существующей системы.

Тем не менее, мне все же пришлось сделать систему загрузочной. С некоторой помощью @debrobert я сделал следующее:

  1. Переключение с grub-pcнаgrub-efi
  2. Подключен существующий системный раздел EFI, принадлежащий новой установке. как /boot/efi.
  3. Ран

    grub-install --efi-directory=/boot/efi --bootloader-id=origdebian --force-extra-removable
    

    Это сделало две вещи.

    • Он установил исполняемый файл EFI grubx64.efiв каталог /boot/efi/EFI/origdebian. В новой установке уже был исполняемый файл grubx64.efiв каталоге /boot/efi/EFI/debian.

      Микропрограмма EFI смогла увидеть запись origdebianв загрузочное меню прошивки.

    • Он установил исполняемый файл EFI BOOTX64.EFIв каталог /boot/efi/EFI/BOOT. Это так называемый -«путь съемного носителя». Как описано в Debian Wiki ,

All firmware implentations have to use this path to be able to run an OS installer.

Таким образом, этот путь предназначен для использования в качестве временного запасного варианта. После того, как система загрузится, ее можно удалить.

0
30.09.2019, 16:01
2 ответа

Попробуйте это,

cat access_log | awk '{a[$1]++} END {for(i in a) print a[i],i}' | sort -n | tail -n1

Для определенных IP-адресов:

cat access_log | awk '$1 == "192.168.1.37" || $1 == "192.168.1.110" {a[$1]++} END {for(i in a) print a[i],i}' 
1
28.01.2020, 02:29

Возможно, я не в себе, но это выглядит просто, если вы просто хотите посчитать.

 awk '{print $1}' access.log |uniq |wc -l

Это выведет количество из одного файла. Если вам нужны все из них, вы можете zgrep их всех и использовать ужасное регулярное выражение IP-адреса:

zgrep '\(25[0-5]\|2[0-4][0-9]\|[01][0-9][0-9]\|[0-9][0-9]\)\.\(25[0-5]\|2[0-4][0-9]\|[01][0-9][0-9]\|[0-9][0-9]\)\.\(25[0-5]\|2[0-4][0-9]\|[01][0-9][0-9]\|[0-9][0-9]\)\.\(25[0-5]\|2[0-4][0-9]\|[01][0-9][0-9]\|[0-9][0-9]\)' access.log.*.gz | awk '{print $1}' | uniq |wc -l

Конечно, держу пари, что есть гораздо более простой способ, который вам может дать какой-нибудь умный человек, но для меня это немного рано утром, я просто выбрасываю это решение. Протестировано на моем веб-сервере с nginx, он работает с моими 50+ лог-файлами.

Согласно OP, если у вас нет zgrep, вы можете сначала запустить файлы журнала через gzip...

ОП отметил в другом сообщении, что это сработало для него. Это также взято из решения msp9011, так что отдаю должное.

cat access.log | awk '{a[$1]++} END {for(i in a) print a[i],i}' |sort -nr

ОП хотела бы, чтобы решение печатало строки с более чем 100 запросами. Думаю, это можно сделать одним awk-выражением, но я сделаю это методом грубой силы:

  cat access.log | awk '{a[$1]++} END {for(i in a) print a[i],i}' |awk '$1>100' | sort -nr
1
28.01.2020, 02:29

Теги

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