Извлечение данных из журнала, который содержит определенный шаблон - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть файл журнала Apache со строками в этом формате:

192.168.100.1 - - [13/Dec/2018:15:11:52 -0600] "GET/onabc/soitc/BackChannel/?param=369%2FGetTableEntryList%2F7%2Fonabc-s31%2FHPD%3AIncident%20Management%20Console27%2FDefault%20User%20View%20(Manager)9%2F3020872007%2Resolved%22%20AND%20((%27Assignee%20Login%20ID%27%20%3D%20%22Allen%22)Token=FEIH-MTJQ-H9PR-LQDY-WIEA-ZULM-45FU-P1FK HTTP/1.1"    

Мне нужно извлечь некоторые данные из файла журнала Apache только в том случае, если строка содержит слово «login» и выводит списокIP, дату и идентификатор входа в систему (в данном случае «Allen» - это идентификатор входа в систему) или сохраните их в другом файле.

Благодаря вашему совету я теперь использую PowerShell, чтобы это работало, у меня теперь есть следующее:

$Readlog = Get-content -path C:\Example_log.txt
$Results = foreach ($Is_login in $Readlog)
{
    if ($Is_login -match 'login')
    {
        [PSCustomObject]@{
            IP = $Is_login.Split(' ')[0]#No need to trim the start.
            Date = $Is_login.Split('[]')[1].Split(':')[0]
            Hour = $Is_login.Split('[]')[1].Split(' ')[0] -Replace ('\d\d\/\w\w\w\/\d\d\d\d:','')
            LoginID = select-string -InputObject $Is_login -Pattern "(?<=3D%20%22)\w{1,}" -AllMatches | % {$_.Matches.Groups[0].Value}
            Status = select-string -InputObject $Is_login -Pattern "(?<=%20%3C%20%22)\w{1,}" -AllMatches | % {$_.Matches.Groups[0].Value}
        }
    }
}
$Results

Благодаря вашим подсказкам, теперь у меня есть такие результаты:

IP      : 192.168.100.1
Date    : 13/Dec/2018
Hour    : 15:11:52
LoginID : Allen
Status  : Resolved

IP      : 192.168.100.30
Date    : 13/Dec/2018
Hour    : 16:05:31
LoginID : Allen
Status  : Resolved

IP      : 192.168.100.40
Date    : 13/Dec/2018
Hour    : 15:11:52
LoginID : ThisisMyIDHank
Status  : Resolved

IP      : 192.168.100.1
Date    : 13/Dec/2018
Hour    : 15:11:52
LoginID : Hank
Status  : Resolved

Спасибо всем за вашу помощь.

1 Ответ

0 голосов
/ 14 декабря 2018

[заменен код с использованием звездочек в данных выборки.который содержит «логин» и затем извлекает запрошенную информацию, используя основные строковые операторы.я пытался использовать регулярные выражения, но увязли в сопоставлении с образцом.[ blush ] регулярное выражение почти наверняка будет быстрее, но мне легче это понять.

# fake reading in a text file
#    in real life, use Get-Content
$InStuff = @'
192.168.100.1 - - [13/Dec/2018:15:11:52 -0600] "GET/onabc/soitc/BackChannel/?param=369%2FGetTableEntryList%2F7%2Fonabc-s31%2FHPD%3AIncident%20Management%20Console27%2FDefault%20User%20View%20(Manager)9%2F3020872007%2Resolved%22%20AND%20((%27Assignee%20Login%20ID%27%20%3D%20%22Allen%22)Token=FEIH-MTJQ-H9PR-LQDY-WIEA-ZULM-45FU-P1FK HTTP/1.1"
100.100.100.100 - - [06/Nov/2018:10:10:10 -0666] "nothing that contains the trigger word"
'@ -split [environment]::NewLine

$Results = foreach ($IS_Item in $InStuff)
    {
    if ($IS_Item -match 'login')
        {
        # build a custom object with the desired items
        #    the PSCO makes export to a CSV file very, very easy [*grin*] 
        # the split pattern is _very fragile_ and will break if the pattern is not consistent
        #    a regex pattern would likely be both faster and less fragile, but i can't figure one out
        [PSCustomObject]@{
            IP = $IS_Item.Split(' ')[0].TrimStart('**')
            Date = $IS_Item.Split('[}')[1].Split(':')[0]
            # corrected for not-really-there asterisks
            #LoginName = $IS_Item.Split('*')[-3]
            LoginName = (($IS_Item.Split(')')[-2] -replace '%\w{2}') -csplit 'ID')[1]
            }
        }
    }

# show on screen
$Results

# save to a CSV file
$Results |
    Export-Csv -LiteralPath "$env:TEMP\Henry_Chinasky_-_LogExtract.CSV" -NoTypeInformation

на экране вывода ...

IP            Date        LoginName
--            ----        ---------
192.168.100.1 13/Dec/2018 Allen   

содержимое файла csv ...

"IP","Date","LoginName"
"192.168.100.1","13/Dec/2018","Allen"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...