PowerShell - [решено] Реализация grep средствами powershell

Аватара пользователя
nwss

PowerShell - [решено] Реализация grep средствами powershell

Сообщение nwss »

У меня есть вот такой вывод одной утилиты

[spoiler]CSP (Type:80) v5.0.10003 KC3 Release Ver:5.0.11455 OS:Windows CPU:AMD64 FastCode:READY:AVX.

AcquireContext: OK. HCRYPTPROV: 9023212

GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider

Container name: "Михеева Ольга Алупьевна 1114443106"

Signature key is not available.

Exchange key is available. HCRYPTKEY: 0x8b7999

Symmetric key is not available.

UEC key is not available.

Keys in container:

exchange key

Extensions:

OID: 1.2.643.2.2.37.3.10

PrivKey: Not specified - 14.02.2023 13:31:19 (UTC)



OID: 1.2.643.2.2.37.3.1

Certificates: 1:

DName: E=uc_fk@roskazna.ru, S=г. Москва, INN=007710568760, OGRN=1047797019830, STREET="Большой Златоустински

й переулок, д. 6, строение 1", L=Москва, C=RU, O=Федеральное казначейство, CN=Федеральное казначейство



OID: 1.2.643.2.2.37.3.3

Certificates: 1:

DName: E=dit@minsvyaz.ru, C=RU, S=77 Москва, L=г. Москва, STREET="улица Тверская, дом 7", O=Минкомсвязь Росс

ии, OGRN=1047702026701, INN=007710474375, CN=Минкомсвязь России

Total: SYS: 0,000 sec USR: 0,000 sec UTC: 0,029 sec

[ErrorCode: 0x00000000][/spoiler]






из которого мне нужно достать дату чтобы сравнить ее с текущей

прибегая к сторонним утилитам я юзал grep где это решалось строкой: grep -Eo "[0-9]{2}\.[0-9]{2}\.[0-9]{4}"

в powershell мне не хватает ключа -o чтобы выдернуть только ту часть строки, которая соответствует паттерну

как это сделать?





вот мой код

[spoiler]Код:
[/spoiler]

Код: Выделить всё

chcp 65001
$CSPTest = "C:\Program Files (x86)\Crypto Pro\CSP\csptest.exe"
$Conts = . $CSPTest -keys -enum -verifyco
$OnlyContainers = $Conts | Select-Object -SkipLast 3 | Select-Object -Skip 2
$CurrentDate = get-date -Format 'dd.MM.yyyy HH:mm:ss'
foreach($Container in $OnlyContainers){
    $ContInfo = . $CSPTest -keyset -container $Container
    $ContainerDate = $ContInfo -match '[0-9]{1,2}\.[0-9]{2}\.[0-9]{4}'
    Write-Host $Container
    if ($CurrentDate -ge $ContainerDate){
        #. $CSPTest -keys -enum -verifyco -deletek -pattern $Container
        Write-Host -ForegroundColor Green $ContainerDate -NoNewline
    } else {
        Write-Host -ForegroundColor Red $ContainerDate -NoNewline
    }
    Write-Host " : " -NoNewline
    Write-Host -ForegroundColor Yellow $CurrentDate
}













вывод

[spoiler]Абрамова Юлия Ивановна 314122617

PrivKey: Not specified - 13.06.2023 14:57:04 (UTC) : 13.01.2023 14:32:54

ДЕНИНА ЛУЛУМБА ВАСИЛЬЕВНА 1213244259

PrivKey: Not specified - 19.03.2024 17:43:38 (UTC) : 13.01.2023 14:32:54

Астахова Марина Сергеевна 1114442618

PrivKey: Not specified - 14.02.2023 13:26:51 (UTC) : 13.01.2023 14:32:54

Данилова Хрыстина Викторовна 1114443106

PrivKey: Not specified - 14.02.2023 13:31:19 (UTC) : 13.01.2023 14:32:54[/spoiler]






желаемый вывод

[spoiler]Абрамова Юлия Ивановна 314122617

13.06.2023 14:57:04 : 13.01.2023 14:32:54

ДЕНИНА ЛУЛУМБА ВАСИЛЬЕВНА 1213244259

19.03.2024 17:43:38 : 13.01.2023 14:32:54

Астахова Марина Сергеевна 1114442618

14.02.2023 13:26:51 : 13.01.2023 14:32:54

Данилова Хрыстина Викторовна 1114443106

14.02.2023 13:31:19 : 13.01.2023 14:32:54[/spoiler]






Заранее спасибо
Аватара пользователя
YuS_2

Re: PowerShell - [решено] Реализация grep средствами powershell

Сообщение YuS_2 »

Цитата nwss:



в powershell мне не хватает ключа -o чтобы выдернуть только ту часть строки, которая соответствует паттерну
PowerShell - [решено] Реализация grep средствами powershell






Код:

Код: Выделить всё

$text = @"
Абрамова Юлия Ивановна 314115617
PrivKey: Not specified - 13.06.2023 14:57:04 (UTC) : 13.01.2023 14:32:54
ДЕНИНА ЛУЛУМБА ВАСИЛЬЕВНА 1219144259
PrivKey: Not specified - 19.03.2024 17:43:38 (UTC) : 13.01.2023 14:32:54
Астахова Марина Сергеевна 1115102618
PrivKey: Not specified - 14.02.2023 13:26:51 (UTC) : 13.01.2023 14:32:54
Данилова Хрыстина Викторовна 1115103106
PrivKey: Not specified - 14.02.2023 13:31:19 (UTC) : 13.01.2023 14:32:54
"@
$pattern = "[0-9]{2}\.[0-9]{2}\.[0-9]{4}"
(sls -inp $text -patt $pattern -all).matches.value


Цитата nwss:



желаемый вывод
PowerShell - [решено] Реализация grep средствами powershell






Код:

Код: Выделить всё

$text = @"
Абрамова Юлия Ивановна 314115617
PrivKey: Not specified - 13.06.2023 14:57:04 (UTC) : 13.01.2023 14:32:54
ДЕНИНА ЛУЛУМБА ВАСИЛЬЕВНА 1219144259
PrivKey: Not specified - 19.03.2024 17:43:38 (UTC) : 13.01.2023 14:32:54
Астахова Марина Сергеевна 1115102618
PrivKey: Not specified - 14.02.2023 13:26:51 (UTC) : 13.01.2023 14:32:54
Данилова Хрыстина Викторовна 1115103106
PrivKey: Not specified - 14.02.2023 13:31:19 (UTC) : 13.01.2023 14:32:54
"@
$pattern = "[0-9]{2}\.[0-9]{2}\.[0-9]{4}"
$text -split "`n"|%{
	$_ -replace "^privkey.*?(?=$pattern)" -replace "\s\(utc\)"
}
Аватара пользователя
YuS_2

Re: PowerShell - [решено] Реализация grep средствами powershell

Сообщение YuS_2 »

Нет Криптопро под рукой, поэтому исходником выступает текст.



Код:

Код: Выделить всё

$t = get-date
$source = gc "D:\temp\1.txt"
$timeStamp = ($source |sls -pattern '^PrivKey:') -replace '.+(\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2}).+','$1' -as [datetime]
($timeStamp - $t).days
31
Аватара пользователя
DJ Mogarych

Re: PowerShell - [решено] Реализация grep средствами powershell

Сообщение DJ Mogarych »

Нет Криптопро под рукой, поэтому исходником выступает текст.



Код:

Код: Выделить всё

$t = get-date
$source = gc "D:\temp\1.txt"
$timeStamp = ($source |sls -pattern '^PrivKey:') -replace '.+(\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2}).+','$1' -as [datetime]
($timeStamp - $t).days
31
Аватара пользователя
Sham

Re: PowerShell - [решено] Реализация grep средствами powershell

Сообщение Sham »

$ContainerDate у вас булев тип, поэтому сравнение дат не будет работать. Найденная подстрока лежит в
$matches[0]


Причём надо проверять $ContainerDate на $true иначе уходить на следующую итерацию с continue, иначе в случае несовпадения будет проверяться последнее совпавшее.
Аватара пользователя
Serguei Kouzmine

Re: PowerShell - [решено] Реализация grep средствами powershell

Сообщение Serguei Kouzmine »

Цитата DJ Mogarych:



CMD/BAT - [решено] сравнение дат




Мой ответ Могарычу спустя пол года Изображение





Готовый рабочий и безопасный скрипт удаления старых контейнеров

[spoiler]Код:
[/spoiler]

Код: Выделить всё

# Для powershell ise нужна смена кодировки
#chcp 65001
if ([Environment]::Is64BitOperatingSystem){
    $CSPTest = "C:\Program Files (x86)\Crypto Pro\CSP\csptest.exe"
} else {
    $CSPTest = "C:\Program Files\Crypto Pro\CSP\csptest.exe"
}
$RegExpPattern = "[0-9]{2}\.[0-9]{2}\.[0-9]{4} [0-9]{2}\:[0-9]{2}\:[0-9]{2}"
$Conts = . $CSPTest -keys -enum -verifyco
$OnlyContainers = $Conts | Select-Object -SkipLast 3 | Select-Object -Skip 2
$CurrentDate = (get-date -Format 'dd.MM.yyyy HH:mm:ss') -as [DateTime]
foreach($Container in $OnlyContainers){
    $ContInfo = . $CSPTest -keyset -container $Container
    $ContainerDate = (Select-String -InputObject $ContInfo -Pattern $RegExpPattern).matches.value -as [DateTime]
    if (-Not($ContainerDate -eq $null)){
        Write-Host 'Контейнер: ' -NoNewline
        Write-Host $Container -ForegroundColor Cyan
        Write-Host 'Действителен до: ' -NoNewline
        Write-Host -ForegroundColor Yellow $ContainerDate -NoNewline
        $DateDifference = $ContainerDate - $CurrentDate
        $LongStr = " (Осталось $($DateDifference.Days) дней $($DateDifference.Hours) часов $($DateDifference.Minutes) минут)"
        if ($CurrentDate -ge $ContainerDate){
            Write-Host $LongStr + '- Удаляем' -ForegroundColor Red
            . $CSPTest -keys -enum -verifyco -deletek -pattern $Container > $null
        } else {
            Write-Host $LongStr -ForegroundColor Green
        }
    } else {
        Write-Host 'Контейнер: ' -NoNewline
        Write-Host $Container -ForegroundColor Cyan
        Write-Host 'Без сертификата' -ForegroundColor Magenta
    }
}
Аватара пользователя
nwss

Re: PowerShell - [решено] Реализация grep средствами powershell

Сообщение nwss »

Цитата DJ Mogarych:



Отлично! Если освоите Custom Objects, будет чудесно.



https://www.google.com/search?q=powe...+Custom+Object




Это как-то помогло бы мне решить данную задачу более элегантно?
Аватара пользователя
DJ Mogarych

Re: PowerShell - [решено] Реализация grep средствами powershell

Сообщение DJ Mogarych »

Полагаю, да, и в будущем очень пригодится.

Можно делать более наглядное и удобное представление данных (таблицы, например), которые потом, например, легко конвертируются в html-отчёты, Excel-документы и прочее.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»