Как извлечь полный user-agent (с пробелами) из файла журнала

Вопрос или проблема

строка журнала

4/10/2024--06:00pm гость 192.168.1.2 https://nixnut.nz/home/accounts/hosting.cgi?action=getonline Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0

в файле просмотра журнала у меня есть

open (FILE, "tail -$form{'howmany'} $file | tail -$form{'howmany'} |") or die "Ошибка открытия $file: $!";

  while (<FILE>) {
    chomp;
    s/^\"//;
    s/\"$//;
    my ($date, $user, $host, $page, $browser) = split(' ', $_);
print "<tr bgcolor=black>";
print "<td bgcolor=white align=left valign=top>$font $date</td>";
print "<td bgcolor=white align=left valign=top><a href=http://nixnut.nz/$user target=_blank>$font $user</a></td>";
print "<td bgcolor=white align=left valign=top>$font <a href=https://www.iptolocation.io/ip-lookup/$host target=_blank>$host</a></td>";
print "<td bgcolor=white align=left valign=top>$font <a href=http://$host target=_blank>$host</a></td>";
print "<td bgcolor=white align=left valign=top><a href=$page target=_blank>$font $page</a></td>";
print "<td bgcolor=white align=left valign=top>$font $browser</td>";
print "</tr>\n";
  }
  close (FILE);

вывод:

4/10/2024--06:00pm  гость   192.168.1.2 192.168.1.2 https://nixnut.nz/home/accounts/hosting.cgi?action=getonline    Mozilla/5.0

не хватает полного useragent из-за пробелов

Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0       

Добавьте аргумент LIMIT к вызову split(). У вас есть пять переменных для полей, поэтому LIMIT равен 5:

my ($date, $user, $host, $page, $browser) = split(' ', $_, 5);

Первые четыре поля, разделенные пробелами, будут помещены в $date, $user, $host и $page, как и раньше. $browser получит остаток строки вместо только части до следующего пробела.

Смотрите страницу Perldoc для split() для получения полной информации и примеров.

Ответ или решение

Для извлечения полного user-agent из лог-файла, где user-agent содержит пробелы, необходимо внести изменения в код, использующий функцию split. Дело в том, что функция split разбивает строку на части на основе указанного разделителя, в данном случае пробела. Когда в поле user-agent присутствуют пробелы, часть информации теряется.

Вот шаги, которые нужно выполнить для правильного извлечения user-agent:

  1. Изменение функции split:
    Вам необходимо добавить аргумент LIMIT в вызов функции split. Поскольку у вас есть четыре переменные для полей, лимит должен быть равен 5. Это позволит функции split поместить первые четыре поля в переменные $date, $user, $host и $page, а остаток строки, который включает в себя полный user-agent, — в переменную $browser.

  2. Обновление кода:
    Измените строку, где используется функция split, следующим образом:

    my ($date, $user, $host, $page, $browser) = split(' ', $_, 5);

    Это значение 5 указывает на то, что строка будет разделена на максимум 5 частей, где первые четыре части пойдут в соответствующие переменные, а оставшаяся часть будет помещена в переменную $browser.

  3. Полный пример кода:
    Вот как будет выглядеть ваш обновленный код для обработки лог-файла:

    open (FILE, "tail -$form{'howmany'} $file | tail -$form{'howmany'} |") or die "Ошибка открытия $file: $!";
    
    while (<FILE>) {
       chomp;
       s/^\"//;
       s/\"$//;
       my ($date, $user, $host, $page, $browser) = split(' ', $_, 5);
       print "<tr bgcolor=black>";
       print "<td bgcolor=white align=left valign=top>$font $date</td>";
       print "<td bgcolor=white align=left valign=top><a href=http://nixnut.nz/$user target=_blank>$font $user</a></td>";
       print "<td bgcolor=white align=left valign=top>$font <a href=https://www.iptolocation.io/ip-lookup/$host target=_blank>$host</a></td>";
       print "<td bgcolor=white align=left valign=top><a href=http://$host target=_blank>$host</a></td>";
       print "<td bgcolor=white align=left valign=top><a href=$page target=_blank>$font $page</a></td>";
       print "<td bgcolor=white align=left valign=top>$font $browser</td>";
       print "</tr>\n";
    }
    close (FILE);

Таким образом, теперь переменная $browser будет содержать весь user-agent, включая возможные пробелы, что позволит вам корректно обрабатывать и выводить эту информацию.

Если у вас есть дополнительные вопросы или требуются дальнейшие объяснения, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...