Форум программистов, компьютерный форум, киберфорум
Наши страницы
PowerShell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
mix4it
0 / 0 / 0
Регистрация: 15.01.2016
Сообщений: 4
#1

Обьединение дубликатов строк по определённому правилу

15.01.2016, 10:58. Просмотров 1015. Ответов 6
Метки нет (Все метки)

Добрый день. Помогите с одной задачкой.
Выгружаю логи с серверов:

PowerShell
1
Get-Eventlog system -after $yesterday -before $today -Entry error -comp $comp | Select-Object Machinename,Timewritten,Source,EventID,Message | Export-Csv -path $patha -Append -notypeinformation -UseCulture -Encoding utf8;
Необходимо когда Message повторяется, добавить поле Timewritten дубликата в поле Timewritten оригинала, а затем удалить строку дубликата.
Чтобы не было по одинаковым ошибкам отдельных строк. Но для удобства анализа видно, во сколько и сколько раз ошибка возникала.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2016, 10:58
Ответы с готовыми решениями:

Переименование файлов по определённому правилу
Нужно переименовать все файлы lab01.txt, lab02.txt … в каталоге К в...

Переименование файлов по определённому правилу
Всю голову сломал, никак не могу понять как можно с помощью командной строки...

Заполнение матрицы по определённому правилу
Дано число n. Создайте массив размером n×n и заполните его по следующему...

Переименование файлов по определённому правилу
Доброе время суток. Задача: есть много файлов. Нужно в каждом из файлов...

Переименование файлов по определённому правилу
Как сделать еще 1 задание Переименовать все файлы lab01.txt, Inf_lab02.txt … в...

6
KDE777
726 / 539 / 232
Регистрация: 22.01.2016
Сообщений: 1,499
23.01.2016, 02:59 #2
С такой постановкой задачи у вас в колонке Timewritten будет или одно значение или массив из нескольких, что в дальнейшем затруднит обработку этой таблицы...


Могу предложить такой вариант - сохраняется только последняя строка с повторяющемся Message, но при этом добавляется колонка Count, в которой указано суммарное количество этих событий

Для теста можно заменить значение -EntryType с Error на Information (таких записей будет точно много)

PowerShell
1
2
3
4
5
6
7
$computer = 'ServerName'
$today = Get-Date
$yesterday = $today.AddDays(-1)
 
Get-Eventlog -LogName system -After $yesterday -Before $today -EntryType Error -ComputerName $computer | Select-Object Machinename,Timewritten,Source,EventID,Message `
| Group-Object Message | select Count -ExpandProperty Group | sort Message -Unique | sort Timewritten `
| Out-GridView
1
mix4it
0 / 0 / 0
Регистрация: 15.01.2016
Сообщений: 4
25.01.2016, 10:38  [ТС] #3
Спасибо!
Покопавшись я все таки сделал что хотел, но как вы и сказали возникла проблема с дальнейшей обработкой этих данных.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$compini = "C:\Scripts\Servlog\complist.ini";
$complis = Get-Content $compini;
$today = get-date;
$yesterday = (get-date).AddDays(-1);
$v4era = $yesterday.ToString("ddMMyy");
$out2 = @{};
$out = @{};
$patha = "C:\Scripts\Servlog" + $v4era + ".csv";
foreach ($comp in $complis){
$csv = Get-Eventlog application -after $yesterday -before $today -Entry error -comp $comp | Select-Object Machinename,Timewritten,Source,EventID,Message 
$csv | ForEach-Object {
$id = [string]$csv.Message
$out[$id]=[string]$_.timewritten + "," + $out[$id]
if ($out2.ContainsKey($id)) {$line = $_.MachineName +";"+ $out[$id] + ";"+ $_.Source +";"+ $_.EventID +";"+ $_.Message}
else {$line = $_.MachineName +";"+ $_.TimeWritten + ";"+ $_.Source +";"+ $_.EventID +";"+ $_.Message}
$out2[$id]=$line
}
}
А именно, теперь не могу красиво эти данные ($out2.value) засунуть в csv файл. В столбце message часть предложения переносится в новую строчку.
0
KDE777
726 / 539 / 232
Регистрация: 22.01.2016
Сообщений: 1,499
25.01.2016, 12:45 #4
Лучший ответ Сообщение было отмечено mix4it как решение

Решение

mix4it, у вас точно этот скрипт работает? В 12 строке - $id = [string]$csv.Message, но $csv - это весь массив с выбранными событиями.

Цитата Сообщение от mix4it Посмотреть сообщение
В столбце message часть предложения переносится в новую строчку.
Это потому, что в поле message есть большие сообщения из нескольких абзацев, которые содержат символ перевода строки.

Тут надо или всё объединять в одну строку, как-то так:

$event.Message.Split() -join ' '

Или так:

$event.Message.Replace("`n",'')

Если вам точно нужно, для повторяющихся событий, в поле TimeWritten несколько значений, то у меня получилось так:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$complis = Get-Content -Path "C:\Scripts\Servlog\complist.ini"
$today = get-date
$yesterday = (get-date).AddDays(-1)
$v4era = $yesterday.ToString("ddMMyy")
$patha = "C:\Scripts\Servlog" + $v4era + ".csv"
$out = @{}
 
foreach ($comp in $complis)
{
 
    foreach ($event in (Get-Eventlog application -after $yesterday -before $today -Entry error -comp $comp))
    {
    $id = $event.Message
    
    #$message = $event.Message.Replace("`n",'')
    $message = $event.Message.Split() -join ' '
        
    if ($out.ContainsKey($id))
        {
        $DupEvent = $out[$id].split(';')[1]
        $NextTimeWritten = $DupEvent + ',' + $event.TimeWritten.ToString()
        $line = $event.MachineName,$NextTimeWritten,$event.Source,$event.EventID,$message -join ';'
        }
    else {$line = $event.MachineName,$event.TimeWritten.ToString(),$event.Source,$event.EventID,$message -join ';'}
    
    $out[$id] = $line
    }
 
}
 
$out.Values | Set-Content -Path $patha -Force:$true -Encoding UTF8
Но хочу заметить, что одинаковых событий может быть очень много и работать с такой таблицей будет крайне неудобно...
1
mix4it
0 / 0 / 0
Регистрация: 15.01.2016
Сообщений: 4
25.01.2016, 15:58  [ТС] #5
Проблема осталась с такими типами message:
SnapManager for SQL Server completed the backup operations with error(s) on the following number of databases on server:

Succeeded: 10 Not run: 2 Total databases detected: 12

Note: 'Not Run' is considered as an error.
0
KDE777
726 / 539 / 232
Регистрация: 22.01.2016
Сообщений: 1,499
25.01.2016, 16:43 #6
Есть несколько видов перевода строки, попробуйте так:

PowerShell
1
2
3
4
5
6
7
8
$test = "SnapManager for SQL Server completed the backup operations with error(s) on the following number of databases on server:
 
Succeeded: 10   Not run: 2  Total databases detected: 12
 
Note: 'Not Run' is considered as an error."
 
$message = $test -replace "`n|`r|`t"
$message
И получаем одну строчку:

SnapManager for SQL Server completed the backup operations with error(s) on the following number of databases on server:Succeeded: 10Not run: 2Total databases detected: 12Note: 'Not Run' is considered as an error.

Добавлено через 2 минуты
А ещё можно так:

PowerShell
1
$test -replace "`n|`r|`t"," "
SnapManager for SQL Server completed the backup operations with error(s) on the following number of databases on server: Succeeded: 10 Not run: 2 Total databases detected: 12 Note: 'Not Run' is considered as an error.

Добавлено через 24 минуты
Проверил, у меня этот способ не оставил многострочных сообщений, т.е. в моём скрипте 16 строчку:

PowerShell
1
$message = $event.Message.Split() -join ' '
нужно поменять на:

PowerShell
1
$message = $event.Message -replace "`n|`r|`t"," "
1
mix4it
0 / 0 / 0
Регистрация: 15.01.2016
Сообщений: 4
25.01.2016, 17:21  [ТС] #7
А у меня все также... Ладно, спасибо, понял куда копать. Попытаюсь сам разобраться в чем косяк
0
25.01.2016, 17:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2016, 17:21

Сформировать новый массив по определённому правилу
Дан массив целых чисел а1,…,аk. Если элемент массива отрицательный, то умножить...

Поиск текста в XML-файле по определённому правилу
Есть файл xml. Есть файл txt1 содержит текст 00.00.00.00 В xml нужно найти...

Переименование файлов по определённому правилу и их перемещение в папки с соответствующими именами
Здравствуйте. Помогите пожалуйста написать батник. Необходимо переименовать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru