Нужна помощь с .bat скриптом для разбора логов W3C - PullRequest
1 голос
/ 11 января 2009

Я пытаюсь получить значение (IP-адрес) из файла журнала W3C (вроде текстового файла). Это то, что у меня есть, но безуспешно:

Set filename=ex%date:~-2,4%%date:~-10,2%%date:~-7,2%.log

For /F "tokens=2 delims=: . " %%A in ('E:\WINDOWS\system32\LogFiles\MSFTPSVC6141885\%filename%') do (Set ip=%%A)

и файл журнала выглядит так:

# Software: Microsoft Internet Information Services 6.0
# Version: 1.0
#Date: 2009-01-10 20:58:16
#Fields: time c-ip cs-method cs-uri-stem sc-status sc-win32-status 
#20:58:16 10.10.1.111 [25]USER anonymous 331 0

поэтому IP-адрес находится во второй колонке 5-й строки (10.10.1.111)

любая обратная связь будет оценена!

Ответы [ 2 ]

3 голосов
/ 11 января 2009

Вы пробовали Microsoft Log Parser ? Предположительно, он поддерживает готовые файлы журнала в стиле W3C. Я не знаю, что вы пытаетесь сделать, но это может быть проще, чем ручное создание пакетного файла.

В качестве альтернативы, установите AWK (например, из Cygwin). Или даже Perl - это его смысл.

1 голос
/ 11 января 2009

Измените for строку на эту:

For /F "skip=4 tokens=2" %%A in (E:\WINDOWS\system32\LogFiles\MSFTPSVC6141885\%filename%) do (
    Set ip=%%A
    goto :DONE
)
:DONE
@echo IP = %ip%
:: Continue script

skip=4 проигнорирует первые четыре строки файла журнала и начнет анализ 5-й. Вам нужно goto, чтобы прекратить синтаксический анализ остальных строк в файле, иначе вы прокрутите весь файл, и ip будет равен второму токену последней строки, который может быть или не быть IP адрес.

Разделителем по умолчанию является пробел, поэтому вам не нужно менять его с помощью аргумента delims. Вам нужен только второй токен, который является IP-адресом.

Вам не нужно заключать имя файла в одинарные кавычки, поскольку вы анализируете содержимое файла, а не строку имени файла. Если в имени файла есть пробелы, вы должны использовать эту строку for вместо:

For /F "usebackq skip=4 tokens=2" %%A in ("E:\WINDOWS\system32\LogFiles\MSFTPSVC6141885\%filename%") do (
...