Что нового

[Данные, строки] Разбор лога файрвола KerioControl

zoxer1

Знающий
Сообщения
72
Репутация
6
Добрый день!

Я не силен в рег.выражениях и поэтому прошу помощи надо разбить строку и изъять данные. Пример строки
Код:
[21/Oct/2011 09:47:51] [ID] 7766 [Rule] GPRS Synhro [Connection] TCP 77.74.67.229:20394 -> Server:1126 [Duration] 59 sec [Bytes] 940/724/1664 [Packets] 15/16/31

надо вытащить данные такие как:
1. 21/Oct/2011 09:47:51
2. 7766
3. 77.74.67.229:20394
4. 59 sec
5. 940/724/1664
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
zoxer1,
Попробуйте так.
Код:
$sString = '[21/Oct/2011 09:47:51] [ID] 7766 [Rule] GPRS Synhro [Connection] TCP 77.74.67.229:20394 -> Server:1126 [Duration] 59 sec [Bytes] 940/724/1664 [Packets] 15/16/31'

$sDate = StringRegExpReplace($sString, '^\[(.*?)\].*', '$1')
$sID = StringRegExpReplace($sString, '.*\[ID\]\D(\d+)\D.*', '$1')
$sConnection = StringRegExpReplace($sString, '.*\D(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{2,5})\D.*', '$1')
$sDuration = StringRegExpReplace($sString, '.*\[Duration\]\s?(.*?)\s?\[.*', '$1')
$sBytes = StringRegExpReplace($sString, '.*\[Bytes\]\s?(.*?)\s?\[.*', '$1')

ConsoleWrite('Date:' & @TAB & $sDate & @LF)
ConsoleWrite('ID:' & @TAB & $sID & @LF)
ConsoleWrite('Connection:' & @TAB & $sConnection & @LF)
ConsoleWrite('Duration:' & @TAB & $sDuration & @LF)
ConsoleWrite('Bytes:' & @TAB & $sBytes & @LF)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
madmasles
лучше это сделать в одном выражении, зачем лишний раз гонять движок :smile:
Код:
#include <array.au3>
$sString = '[21/Oct/2011 09:47:51] [ID] 7766 [Rule] GPRS Synhro [Connection] TCP 77.74.67.229:20394 -> Server:1126 [Duration] 59 sec [Bytes] 940/724/1664 [Packets] 15/16/31'
$aAll = StringRegExp($sString, '^\[(\d\d?/\w+/\d{4}\s\d\d:\d\d:\d\d)\]\s\[ID\]\s(\d+).+TCP\s(\d+\.\d+\.\d+\.\d+:\d+).+\[Duration\]\s(\d+\s\w+).+\[Bytes\]\s(\d+/\d+/\d+)', 1)
_ArrayDisplay($aAll)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
можно и так [TCPUD]+
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
Спасибо за ответы, очень помогли...
Но задача изменилась надо дату разделить на дату + время вот так

1. 21/Oct/2011
2. 09:47:51
3. 7766
4. 77.74.67.229:20394
5. 59 sec
6. 940/724/1664

чтот у меня так и нелучается подружится с рег выражениями :wacko:

Код:
можно и так [TCPUD]+
этого ненадо, у меня логируется только трафик 1го порта и именно TCP
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
И
Понимаю, совсем не потеме... но всеже новую тему создавать не решился... Как полученный массив $aAll добавить в один большой Массив, например, чтоб данные 1ой строки были в массиве под индексами $aAll_data[0][0] - $aAll_data[0][4] Просто у меня очень много строк в логе :scratch:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
zoxer1,
Попробуйте так:
Код:
#include <Array.au3>

$iCount = 0
$sText = FileRead(@ScriptDir & '\1.txt')
$aText = StringSplit(StringStripCR($sText), @LF)
Dim $aResult[$aText[0] + 1][6]
For $i = 1 To $aText[0]
	$aTemp = StringRegExp($aText[$i], '(?i)^\[(\d{1,2}/[a-z]{3}/\d{4})\s(\d{2}:\d{2}:\d{2})\]\s\[[a-z]{2}\]\s(\d+).+[a-z]{3}\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{2,5}).+\[[a-z]{8}\]\s(\d+\s[a-z]{3}).+\[[a-z]{5}\]\s(\d+/\d+/\d+)', 3)
	If Not @error And UBound($aTemp) = 6 Then
		$iCount += 1
		For $j = 0 To 5
			$aResult[$iCount][$j] = $aTemp[$j]
		Next
	EndIf
Next
If $iCount Then
	ReDim $aResult[$iCount + 1][6]
	$aResult[0][0] = $iCount
	_ArrayDisplay($aResult)
Else
	MsgBox(16, 'Error', 'Error')
EndIf
 
Верх