none
Powershell поиск в файле с пропуском строк RRS feed

  • Вопрос

  • Приветствую.

    Встала задача просмотра файлов (писем) в папке, поиска в каждом файле определенных данных (адреса отправителя), копирования в отдельный файл и дальнейшее удаления файла.
    Поиск будет осуществляться в определенной папке (ящик с письмами с определенным адресом, спам, короче говоря). туда будут пересылать письма со спамом. смысл - найти отправителя для каждого письма.

    Вопрос:
    поиск осуществляется по всем файлу письма, и в результат попадает адрес пользователя, который находится на 6ой строке файла. Необходимо во время поиска пропускать первые 6 строк, тогда будут попадать только адреса спамеров. Прошу помощи.

    вот что я сделал:

    cls
    $mails = dir C:\Works\*.msg
    foreach ($mail in $mails)
    {
       $a = Select-String -path $mail -pattern "From" -AllMatches | Select-String -pattern "=" -notmatch
        $a
        $a -match "@\S+>"
        $matches[0] -replace "[>]" >> "C:\Works\out-file.txt"
        del $mail
    }


    Сергей Соловьев


    • Изменено sergeant21 30 октября 2015 г. 13:12
    30 октября 2015 г. 11:07

Ответы

  • А так?

    $mails = dir c:\work\*.msg
    foreach ($mail in $mails) {
       $Read = Get-Content $mail #Читаем каждое мыло
       $WhereFrom = $Read -match "^From:\s" #В теле мыла ищем совпадения по началу строки "From:"
       $Parsing = $WhereFrom  -replace 'from:\s=.+=' -replace '<' -replace '>'  -replace '.+\@'
       $Parsing | select -Unique >> C:\work\out_file.txt #Выводим в файл уникальные домены негодяев
       del $mail
    }



    • Изменено NTLose 30 октября 2015 г. 15:20
    • Помечено в качестве ответа sergeant21 2 ноября 2015 г. 14:31
    30 октября 2015 г. 14:50
  • Немного не так.

    Первые 6 строк должны пропускаться (в них не должен идти поиск, т.к. на 6ой строке
    From: =?windows-1251?B?0eXw4+XpINHu6+7i/OXi?= <S.soloviev@111.ru> вот этот вот пользователь - это тот, кто жалуется на спам). а вот все остальные найденные адреса должны находиться и записываться в файл, т.к. адреса спамеров.


    Сергей Соловьев

    $mails = dir c:\work\*.msg
    foreach ($mail in $mails) {
       $Read = Get-Content $mail | Select -Skip 6 #Читаем каждое мыло
       $WhereFrom = $Read -match "^From:\s" #В теле мыла ищем совпадения по началу строки "From:"
       $Parsing = $WhereFrom  -replace 'from:\s=.+=' -replace '<' -replace '>'  -replace '.+\@'
       $Parsing | select -Unique >> C:\work\out_file.txt #Выводим в файл уникальные домены негодяев
       del $mail
    }


    • Изменено sergeant21 2 ноября 2015 г. 14:31
    • Помечено в качестве ответа sergeant21 2 ноября 2015 г. 14:31
    2 ноября 2015 г. 13:32

Все ответы

  • А как выглядит заветная 6ая строка? Выложите пример
    30 октября 2015 г. 11:19
  • Лучше приложить пример msg файлов на обменник и требуемый результат. Как пропустить первые 6 строк.

    $a = Get-Content $mail | Select -Skip 6 | Select-String -pattern "From" -AllMatches 

    30 октября 2015 г. 11:19
    Отвечающий
  • $mails = dir c:\work\*.msg
    foreach ($mail in $mails) {
       $a = Get-Content $mail
       $b = $a -match "^From:\s" 
       $b -replace '^from:\s' >> "c:\work\out-file.txt"
       del $mail
    }

    Как то так мне это видится, если конечно искомая строка все время начинается одинаково =/


    • Изменено NTLose 30 октября 2015 г. 11:39
    30 октября 2015 г. 11:33
  • http://rusfolder.com/44389173
    тут образец письма.

    Результат должен быть такой:
    должен найти все похожие строчки, пропуская первые 6 строк в файле , т.к. там будет сам пользователь
    From: =?windows-1251?B?0eXw4+XpINHu6+7i/OXi?= <S.soloviev@111.ru>

    отфильтровать домен, т.е. @111.ru
    и записать все найденные домены в файл.


    Сергей Соловьев


    • Изменено sergeant21 30 октября 2015 г. 14:14 подправил
    30 октября 2015 г. 14:13
  • Парсить это нужно?
    From: =?windows-1251?B?0eXw4+XpINHu6+7i/OXi?= <S.soloviev@111.ru>

    То есть S.soloviev@111.ru негодяй? =) А служебные кракозябры надо убрать, правильно? И вычленить негодяя?

    30 октября 2015 г. 14:29
  • А так?

    $mails = dir c:\work\*.msg
    foreach ($mail in $mails) {
       $Read = Get-Content $mail #Читаем каждое мыло
       $WhereFrom = $Read -match "^From:\s" #В теле мыла ищем совпадения по началу строки "From:"
       $Parsing = $WhereFrom  -replace 'from:\s=.+=' -replace '<' -replace '>'  -replace '.+\@'
       $Parsing | select -Unique >> C:\work\out_file.txt #Выводим в файл уникальные домены негодяев
       del $mail
    }



    • Изменено NTLose 30 октября 2015 г. 15:20
    • Помечено в качестве ответа sergeant21 2 ноября 2015 г. 14:31
    30 октября 2015 г. 14:50
  • Немного не так.

    Первые 6 строк должны пропускаться (в них не должен идти поиск, т.к. на 6ой строке
    From: =?windows-1251?B?0eXw4+XpINHu6+7i/OXi?= <S.soloviev@111.ru> вот этот вот пользователь - это тот, кто жалуется на спам). а вот все остальные найденные адреса должны находиться и записываться в файл, т.к. адреса спамеров.


    Сергей Соловьев

    $mails = dir c:\work\*.msg
    foreach ($mail in $mails) {
       $Read = Get-Content $mail | Select -Skip 6 #Читаем каждое мыло
       $WhereFrom = $Read -match "^From:\s" #В теле мыла ищем совпадения по началу строки "From:"
       $Parsing = $WhereFrom  -replace 'from:\s=.+=' -replace '<' -replace '>'  -replace '.+\@'
       $Parsing | select -Unique >> C:\work\out_file.txt #Выводим в файл уникальные домены негодяев
       del $mail
    }


    • Изменено sergeant21 2 ноября 2015 г. 14:31
    • Помечено в качестве ответа sergeant21 2 ноября 2015 г. 14:31
    2 ноября 2015 г. 13:32