Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скрипт по сбору строк из множества файлов в один. (http://forum.oszone.net/showthread.php?t=323198)

Load980 27-01-2017 10:20 2706616

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

вот что смог собрать

$LineNumber = ‘(wireless.1.ssid=|netconf.3.autoip.status)’
$text = $LineNumber
Get-ChildItem -Path “c:\1\” -Include *.cfg -Exclude "!*" -Recurse |
select-string -Pattern $text -Encoding "Default" -Context 0,10 |
foreach {@($_.FileName), @($_.LineNumber), @($_.Line)}> out.txt

Вроде работает, но есть проблема файл не структурирован

результат:
--------------------------------------------------
10.12.3.20-XM-6875412AA694.cfg
78
netconf.3.autoip.status=disabled
10.12.3.20-XM-6875412AA694.cfg
250
wireless.1.ssid=_WIFI
10.12.3.22-XM-6872514677E6.cfg
76
netconf.3.autoip.status=disabled
10.12.3.22-XM-6872514677E6.cfg
248
wireless.1.ssid=_WIFI

--------------------------------------------------

Хотелось бы видеть отдельным блоком для каждого файла.

как то так:

10.12.3.20-XM-6875412AA694.cfg
netconf.3.autoip.status=disabled
wireless.1.ssid=_WIFI

10.12.3.22-XM-6872514677E6.cfg
netconf.3.autoip.status=disabled
wireless.1.ssid=_WIFI

Спасибо.

Elven 27-01-2017 11:36 2706646

Как-то непонятно куда куски вывода подевались и каким боком они структурировались. А еще, по секрету говорю, никому не признавайтесь, скоро Iska отпишется в этой ветке и потребует исходные файлы. Обычно их удобнее расковыривать, чем возиться с уже полученным выводом.

Iska 27-01-2017 13:35 2706693

Ну, вот, мною уже и детей пугают ;).

Load980, нужны а) образцы исходных файлов (упакуйте в архив, выложите на RGhost или Яндекс.Диск) и б) внятное описание техзадания — что нужно получить.

Load980 27-01-2017 14:50 2706723

Вот пара файлов из которых нужно извлечь информацию

http://rgho.st/6jStXYQYH

Тех задание.

Сделать выборку строк из множества файлов с одинаковым расширением,
осуществить поиск строк содержащих информацию $text = ‘(wireless.1.ssid=|netconf.3.autoip.status|devname)’ - например для этих,
сделать выборку по совпадению вывести строки в текстовый файл по шаблону:

<Имя файла_1>
<Строка_1>
<Строка_2>
<Строка_3>
<Строка_4>

<Имя файла_2>
<Строка_1>
<Строка_2>
<Строка_3>
<Строка_4>
...

Iska 27-01-2017 15:20 2706730

Цитата:

Цитата Load980
из множества файлов с одинаковым расширением, »

И с каким именно?! .cfg?

Цитата:

Цитата Load980
осуществить поиск строк содержащих информацию $text = ‘(wireless.1.ssid=|netconf.3.autoip.status|devname)’ - например для этих, »

Найти строки, содержащие wireless.1.ssid или netconf.3.autoip.status или devname? devname встречается кучу раз. Что делать?

Пишите простым человеческим языком, в ТЗ не надо ничего изобретать.

Цитата:

Цитата Load980
сделать выборку по совпадению вывести строки в текстовый файл по шаблону:
<Имя файла_1>
<Строка_1>
<Строка_2>
<Строка_3>
<Строка_4> »

Опять странности. Что за Строка_1, Строка_2, Строка_3, Строка_4?!

Откуда возьмётся Строка_4, если в шаблоне поиска три значения для поиска? Какое-то значение встретится несколько раз? Возможно. Но, опять же, Вы рассчитываете, что выборка окажется в строго заданном порядке. А ну как окажется, что — нет?

Потому изложите данное условие в виде: сначала идёт имя файла, в котором осуществляется выборка, затем строка с netconf.3.autoip.status, затем строка с wireless.1.ssid, затем строка с… и т.д.

P.S. Вам конечный результат/вид выходного файла для каких целей потребен? Что с ним планируете делать?

Load980 27-01-2017 15:49 2706736

Я Вас понял.
Теперь человеческим языком )
Есть куча сгруженных конфигов с оборудования, была поставлена задача собрать со всех конфигов значения параметров в данном случае это строки после знака "=" их значения, они собственно и нужны,
если возможно вывести только их то будет вообще отлично.


<Имя файла> из которого собираем
netconf.3.ip=
aaa.1.ssid=
radio.1.chanbw=
radio.1.freq=
users.1.name=
wireless.1.ssid=

Цитата:

Цитата Iska
P.S. Вам конечный результат/вид выходного файла для каких целей потребен? »

Нужно вывести собрать данные в таблицу Excel

http://rgho.st/7yZ6Kmmyw

Iska 27-01-2017 21:41 2706811

Многое непонятно в этой таблице. Где в ней, скажем, имя файла? Или, получается, оно вообще не нужно, несмотря на написанное ранее?! Какое соответствие между заголовками таблицы и перечисленными параметрами для выборки?

Что-то со скрипом идёт у меня PowerShell. Попробуйте на WSH:
Скрытый текст
Код:

Option Explicit

Dim strSourceFolder
Dim objFSO

Dim dictPatterns
Dim dictLine

Randomize Timer

Set dictPatterns = WScript.CreateObject("Scripting.Dictionary")
Set dictLine    = WScript.CreateObject("Scripting.Dictionary")

With dictPatterns
        ' Параметр, Заголовок столбца
        .Add "netconf.3.ip",    "IP адрес"
        .Add "aaa.1.ssid",      "bla-bla-bla1"
        .Add "radio.1.chanbw",  "bla-bla-bla2"
        .Add "radio.1.freq",    "Частота"
        .Add "users.1.name",    "bla-bla-bla3"
        .Add "wireless.1.ssid", "bla-bla-bla4"
End With

If WScript.Arguments.Count = 1 Then
        strSourceFolder = WScript.Arguments.Item(0)
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FolderExists(strSourceFolder) Then
                WScript.StdOut.WriteLine Join(dictPatterns.Items(), ";")
               
                ScanSubFolders objFSO.GetFolder(strSourceFolder), "cfg"
        Else
                WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
                WScript.Quit 2
        End If
       
        Set objFSO = Nothing
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
        WScript.Quit 1
End If

dictLine.RemoveAll
dictPatterns.RemoveAll

Set dictLine    = Nothing
Set dictPatterns = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub ScanSubFolders(objFolder, strFileExt)
        Dim objFile
        Dim objSubFolder
       
        Dim arrContent
        Dim arrFilteredContent
       
        Dim strKey
       
        Dim arrKeyValuePair
       
       
        For Each objFile In objFolder.Files
                If StrComp(objFSO.GetExtensionName(objFile.Name), strFileExt, vbTextCompare) = 0 Then
                        With objFSO.OpenTextFile(objFile.Path)
                                arrContent = Split(.ReadAll(), vbLf)
                                .Close
                        End With
                       
                        For Each strKey In dictPatterns.Keys
                                arrFilteredContent = Filter(arrContent, strKey & "=", True, vbTextCompare)
                               
                                If UBound(arrFilteredContent) >= 0 Then
                                        arrKeyValuePair = Split(arrFilteredContent(0), "=")
                                        dictLine.Add arrKeyValuePair(0), """" & arrKeyValuePair(1) & """"
                                Else
                                        dictLine.Add Rnd(), ""
                                End If
                        Next
                       
                        WScript.StdOut.WriteLine Join(dictLine.Items(), ";")
                       
                        dictLine.RemoveAll
                End If
        Next
       
        For Each objSubFolder In objFolder.SubFolders
                ScanSubFolders objSubFolder, strFileExt
        Next
End Sub
'=============================================================================


Вызывайте в виде:
Код:

>"Result.csv" cscript.exe //nologo "Путь\Скрипт.vbs" "Путь к искомой папке"
Вот, что получилось у меня на основе предложенных Вами файлов:
Скрытый текст

Georgio 28-01-2017 07:43 2706872

Код:

$Path = 'C:\1\'
$Out = 'Out.csv'

(
 $a = @(
        'netconf.3.ip'
        'aaa.1.status'
        'radio.1.chanbw'
        'radio.1.freq'
        'users.1.name'
        'wireless.1.ssid'
      )
) | foreach {
            $Title += ('"'+$_+'";')
            }
$Title | Out-File $Out
Get-ChildItem -Path $Path -Include '*.cfg' -Exclude '!*' -Recurse |
    foreach {
            $File = $_
            $a | foreach {
                          $Pattern = $_
                          $Content = Get-Content $File
                          $Content | foreach {
                                                        if ($_ -match "$Pattern=(.*)") {
                                                                                        $Line += ('"'+$Matches[1]+'";')
                                                                                      }
                                                      }
                          }
            $Line | Out-File $Out -Append
            Clear-Variable Line
            }


megaloman 29-01-2017 17:43 2707255

Вложений: 1
Если надо конечный результат в Excel, вот решение, которое макросом собирает данные непосредственно в Excel в прикреплённом Excel-файле (заархивировано в Бланк20170129.rar).
Как пользоваться: 1. Открыть xls-файл (это пустой бланк для дальнейшей работы), открыть макрос для изменения, прописать путь, откуда берутся файлы и, по образцу, имена параметров и в какие ячейки они должны попадать. Сохранить на будущее.
2. Запустить макрос на выполнение, он создаст из бланка новую книгу, куда будут сведены данные из cfg-файлов
Так как Вами поставлена задача недостаточно четко, в дальнейшем можно переделать бланк в том виде, какой Вам требуется - макрос построен достаточно гибко, чтобы указать нужные данные и их местоположение.
Что касается начальной постановки, вот решение CMD
Цитата:

Цитата Load980
<Имя файла_1>
<Строка_1>
<Строка_2>
<Строка_3>
<Строка_4>
<Имя файла_2>
<Строка_1>
<Строка_2>
<Строка_3>
<Строка_4> »

Код:

@Echo off

Set "Mask=Z:\Box_In\*.cfg"
Set "OutFile=%~dpnx0.txt"

Set /A M=0
Call :MassIn "netconf.3.ip="
Call :MassIn "aaa.1.ssid="
Call :MassIn "radio.1.chanbw="
Call :MassIn "radio.1.freq="
Call :MassIn "users.1.name="
Call :MassIn "wireless.1.ssid="

Del "%OutFile%" 2>nul

SetLocal EnableExtensions EnableDelayedExpansion

FOR %%f IN ("%Mask%") DO (
        FOR /L %%i IN (1,1,%M%) DO Call :MassN Find%%i "%%f" N%%i

        >>"%OutFile%" Echo %%~nxf
        FOR /L %%i IN (1,1,%M%) DO Call :OutTxt "%%f" N%%i
        >>"%OutFile%" Echo ------
)
Start " " NOTEPAD "%OutFile%"
GoTo :Eof

:MassIn
        Set /A M+=1
        Set "Find%M%=%~1"
GoTo :Eof

:MassN
        Set /A %3=0
        FOR /F "usebackq delims=[]" %%n IN (`Find /N "%%%~1%%" %2`) DO Set /A %3=%%n-1 2>nul
GoTo :Eof

:OutTxt
        If %2 GEQ 1 FOR /F "usebackq delims=" %%s IN (`more %1 +%%%~2%%`) DO >>"%OutFile%" Echo %%s &GoTo :Eof
GoTo :Eof


Load980 30-01-2017 08:16 2707421

Решено ! Большое спасибо megaloman, то что нужно. Решение от Iska, тоже работает, осталось только допилить под себя и можно собирать данные.
Спасибо еще раз!


Время: 05:53.

Время: 05:53.
© OSzone.net 2001-