Войти

Показать полную графическую версию : [решено] Скрипт по сбору строк из множества файлов в один.


Load980
27-01-2017, 10:20
Доброго всем!, выпала мне рутинная задача собрать из выгруженных файлов информацию в один,

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

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

Iska
27-01-2017, 13:35
Ну, вот, мною уже и детей пугают ;).

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

Load980
27-01-2017, 14:50
Вот пара файлов из которых нужно извлечь информацию

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
из множества файлов с одинаковым расширением, »
И с каким именно?! .cfg?

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

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

сделать выборку по совпадению вывести строки в текстовый файл по шаблону:
<Имя файла_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
Я Вас понял.
Теперь человеческим языком )
Есть куча сгруженных конфигов с оборудования, была поставлена задача собрать со всех конфигов значения параметров в данном случае это строки после знака "=" их значения, они собственно и нужны,
если возможно вывести только их то будет вообще отлично.


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

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

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

http://rgho.st/7yZ6Kmmyw

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

Что-то со скрипом идёт у меня 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" "Путь к искомой папке"

Вот, что получилось у меня на основе предложенных Вами файлов:
http://i.imgur.com/SWgOBKB.png

Georgio
28-01-2017, 07:43
$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
Как пользоваться: 1. Открыть xls-файл (это пустой бланк для дальнейшей работы), открыть макрос для изменения, прописать путь, откуда берутся файлы и, по образцу, имена параметров и в какие ячейки они должны попадать. Сохранить на будущее.
2. Запустить макрос на выполнение, он создаст из бланка новую книгу, куда будут сведены данные из cfg-файлов
Так как Вами поставлена задача недостаточно четко, в дальнейшем можно переделать бланк в том виде, какой Вам требуется - макрос построен достаточно гибко, чтобы указать нужные данные и их местоположение.<Имя файла_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
Решено ! Большое спасибо megaloman, то что нужно. Решение от Iska, тоже работает, осталось только допилить под себя и можно собирать данные.
Спасибо еще раз!




© OSzone.net 2001-2012