Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Нахождение совпадения в строке и сохранение строк в разные файлы

Ответить
Настройки темы
Любой язык - Нахождение совпадения в строке и сохранение строк в разные файлы

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день!

Помогите хотя бы с направлением, куда копать.

Есть огромный (несколько млн строк) текстовый файл с логами. Нужно прочитать строку, найти в ней совпадение имени сервиса и в зависимости от этого сохранить строку в другой файл.

Код: Выделить весь код
20230810 16:44 service1 online
20230810 16:45 service2 online
20230810 17:48 service1 offline
20230810 17:49 service2 offline
В итоге получить файлы service1.log и service2.log

Заранее спасибо!

Отправлено: 19:03, 10-08-2023

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6686
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Powershell
Код: Выделить весь код
gc 'C:\temp\big.log' |% {
    if ($_ -match 'service1') {$_ >> 'C:\temp\service1.log'}
    if ($_ -match 'service2') {$_ >> 'C:\temp\service2.log'}
}

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:05, 10-08-2023 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Deadooshka


Сообщения: 2562
Благодарности: 697

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
gc 'file.log' | ? { $_ -match '\d{8} \d{2}:\d{2} (service1|service2)' } | % { $_ >> "c:\logs\$($Matches[1]).log" }

Последний раз редактировалось Sham, 10-08-2023 в 23:54.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:49, 10-08-2023 | #3


Ветеран


Contributor


Сообщения: 2733
Благодарности: 1698

Профиль | Отправить PM | Цитировать


cmd
Код: Выделить весь код
	@Set "FileIn=Z:\Box_In\Есть текстовый файл.txt"

	>"Z:\Box_In\service1.txt" FindStr /I " service1 " "%FileIn%" 
	>"Z:\Box_In\service2.txt" FindStr /I " service2 " "%FileIn%"

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 11-08-2023 в 08:25.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:11, 11-08-2023 | #4


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Большое спасибо!

Все варианты рабочие, но при тестовом прогоне (1,9млн строк, 300mb) выяснилось, что ps работает в разы дольше скрипта на cmd (ps - 690 секунд, cmd - 2) и сохраняет файл по умолчанию в UTF-16.

ЗЫ Если не сложно, подскажите как кодировку по дефолту в PS оставлять?

Отправлено: 18:08, 11-08-2023 | #5


Deadooshka


Сообщения: 2562
Благодарности: 697

Профиль | Отправить PM | Цитировать


Цитата xam2002:
как кодировку по дефолту в PS оставлять? »
сверху добавьте строку
Код: Выделить весь код
$PSDefaultParameterValues['Out-File:Encoding'] = 'default'
Кодировка в зависимости от исходной (utf8, oem и т.д.). В core версии набор кодировок немного отличается.
Цитата xam2002:
ps работает в разы дольше скрипта на cmd »
конечно же FindStr быстрее, но и ps можно оптимизировать под конкретную задачу.

Последний раз редактировалось Sham, 11-08-2023 в 19:59.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:05, 11-08-2023 | #6


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Sham,
Большое спасибо, забыл, что можно использовать глобальные переменные, пытался с параметром в самом out-file играть.

Цитата Sham:
конечно же FindStr быстрее, но и ps можно оптимизировать под конкретную задачу. »
А можно поподробнее, где почитать? Все-таки ps намного гибче, и возможно в будущем пригодится.

Отправлено: 14:23, 14-08-2023 | #7


Старожил


Сообщения: 232
Благодарности: 21

Профиль | Отправить PM | Цитировать


Можно и мой экзотический вариант попробовать:
Код: Выделить весь код
ForEach ($str in (Get-Content .\service.txt  -Encoding utf8)) {
($str | Select-String -Pattern '[\S\s]*service1[\S\s]*').Matches | ForEach {$_.Value | Out-File -Append .\service1.log -Encoding utf8}
($str | Select-String -Pattern '[\S\s]*service2[\S\s]*').Matches | ForEach {$_.Value | Out-File -Append .\service2.log -Encoding utf8}
}
Насколько будет быстро работать, не знаю, нет такого большого файла на проверить...
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:00, 14-08-2023 | #8


Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


Гораздо быстрее будет когда Select-String читает файл, а не получает его содержимое через пайп.

Код: Выделить весь код
Select-String 'service1' file.log -raw | Out-File service1.log
Select-String 'service2' file.log -raw | Out-File service2.log
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:13, 14-08-2023 | #9


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6686
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Так вроде побыстрее должно быть:
Код: Выделить весь код
function ExtractTo-Chunk ($in,$out,$regex) {
    [regex]$regex = $regex
    [System.IO.File]::AppendAllText("$out", ([System.IO.File]::ReadAllLines("$in") -match $regex -join [Environment]::NewLine))
}

ExtractTo-Chunk -in "C:\temp\big.log" -out "C:\temp\service1.log" -regex "service1"
ExtractTo-Chunk -in "C:\temp\big.log" -out "C:\temp\service2.log" -regex "service2"
Ref: https://stackoverflow.com/questions/...arge-text-file

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:17, 15-08-2023 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Нахождение совпадения в строке и сохранение строк в разные файлы

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2010 - [решено] Excel 2010. Суммирование по столбцу: разные суммы, лист на млн. строк и т.д. flev45 Microsoft Office (Word, Excel, Outlook и т.д.) 2 29-05-2019 13:12
VBS/WSH/JS - массив из строк, поиск по строке matson Скриптовые языки администрирования Windows 11 09-06-2017 21:35
CMD/BAT - [решено] Нахождение совпадения без учета регистра Mikle_home88 Скриптовые языки администрирования Windows 1 04-08-2015 15:20
Расшаренные файлы в лок.сети и разные козлы SimSaf Хочу все знать 8 08-02-2013 00:02
Как переписать текстовые файлы в разные папки! Guest Программирование и базы данных 7 22-10-2004 02:57




 
Переход