Парсинг xml программами командной строки

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Tmye, 5 Jan 2017.

  1. Tmye

    Tmye Member

    Joined:
    24 Nov 2015
    Messages:
    17
    Likes Received:
    6
    Reputations:
    1
    Хочу чтобы xml парсился автоматически, после окончания работы сканера портов и в новом файле были только IP. Программа не важна, главное, чтобы под Windows была (Grep, Awk, Sed).

    Code:
    <?xml version="1.0"?>
    <!-- masscan v1.0 scan -->
    <?xml-stylesheet href="" type="text/xsl"?>
    <nmaprun scanner="masscan" start="1480103894" version="1.0-BETA"  xmloutputversion="1.03">
    <scaninfo type="syn" protocol="tcp" />
    <host endtime="1480103894"><address addr="118.192.160.147" addrtype="ipv4"/><ports><port protocol="tcp" portid="8000"><state state="open" reason="syn-ack" reason_ttl="104"/></port></ports></host>
    <host endtime="1480103895"><address addr="39.177.186.8" addrtype="ipv4"/><ports><port protocol="tcp" portid="8000"><state state="open" reason="syn-ack" reason_ttl="45"/></port></ports></host>
    <host endtime="1480103895"><address addr="14.154.17.140" addrtype="ipv4"/><ports><port protocol="tcp" portid="8000"><state state="open" reason="syn-ack" reason_ttl="44"/></port></ports></host>
    <host endtime="1480103895"><address addr="118.192.184.18" addrtype="ipv4"/><ports><port protocol="tcp" portid="8000"><state state="open" reason="syn-ack" reason_ttl="106"/></port></ports></host>
    <runstats>
    <finished time="1480470645" timestr="2016-11-30 03:50:45" elapsed="366752" />
    <hosts up="1427191" down="0" total="1427191" />
    </runstats>
    </nmaprun>
    Сейчас я делаю в Notepad++ так:

    Найти:
    Code:
    .*?(([0-9]{1,3}[\.]){3}[0-9]{1,3}).*
    Заменить на:
    Code:
    $1
    Пробовал в grep что-то не получается.
     
  2. pas9x

    pas9x Elder - Старейшина

    Joined:
    13 Oct 2012
    Messages:
    428
    Likes Received:
    579
    Reputations:
    47
    Учиться кодить. Срочно.
    PHP:
    <?php

    $inputFile 
    'c:\file.xml';
    $outputFile 'c:\ip.txt';

    $xml = new SimpleXMLElement(file_get_contents($inputFile));
    $selection $xml->xpath('/nmaprun/host/address/@addr');
    $fh fopen($outputFile'w');
    foreach (
    $selection as $attrIP) {
      
    $ip strval($attrIP);
      
    fwrite($fh"$ip\r\n");
    }

    echo 
    "Done.\r\n";
     
  3. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    под винду на powershell можно:
    Code:
    param([string]$f)
    [xml]$xml = Get-Content $f
    $nodes = Select-Xml "//nmaprun/host/address/@addr" $xml
    $nodes | ForEach-Object {$_.Node.'#text'}
    
    PHP:
    PS C:\> .\parser.ps1 -f data.xml result.txt 
     
  4. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    136
    Reputations:
    37
    Держи делфи:
    Code:
    unit Unit1;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,RegExpr;
    
    type
      TForm1 = class(TForm)
        OpenDialog1: TOpenDialog;
        SaveDialog1: TSaveDialog;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        ListBox1: TListBox;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        procedure GetIPList(Str, RegStr: String; LB: TListBox);
    
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
      list:TStringList;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         list:=TStringList.Create;
        if OpenDialog1.Execute then begin
        list.LoadFromFile(OpenDialog1.FileName);
         end;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    If ListBox1.items.text <> '' then begin
      GetIPList(list.Text, '\b([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\b', ListBox1);
    end;
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    begin
       saveDialog1.Filter := 'Text file|*.txt|Html file|*.html';
    if Listbox1.Items.Text<>'' then begin
      SaveDialog1.Execute;
    try
      listbox1.Items.SaveToFile(SaveDialog1.FileName);
      except
      showmessage('Не выбран файл');
      end;
    end;
      end;
    procedure TForm1.GetIPList(Str, RegStr: String; LB: TListBox);
    var RE: TRegExpr;
        i: Integer;
    begin
    RE:=TRegExpr.Create;
    try
      RE.Expression:=RegStr;
      if ExecRegExpr(RegStr,Str) then
       if RE.Exec(Str) then begin
         repeat
           LB.Items.Add( RE.Match[0] );
         until not RE.ExecNext;
      end;
    finally
      RE.Free;
    end;
    end;
    
    end.
    ссылка для винды.
    http://rusfolder.com/45479899
     
    #4 vasykas, 6 Jan 2017
    Last edited: 6 Jan 2017
    Tmye likes this.
  5. Tmye

    Tmye Member

    Joined:
    24 Nov 2015
    Messages:
    17
    Likes Received:
    6
    Reputations:
    1
    alexey-m, на файлах малого размера работает. Но когда я скормил 256 Мб он завис. К сравнению на том же компьютере Notepad++ обрабатывал тот же файл меньше минуты.

    vasykas, спасибо. Взял из твоего кода регулярное выражение и сделал так:
    Code:
    grep -o -E \b([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\b myscan.xml > IP.txt
     
  6. Tmye

    Tmye Member

    Joined:
    24 Nov 2015
    Messages:
    17
    Likes Received:
    6
    Reputations:
    1
    Сделал даже лучше
    Code:
    grep -E -o "([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])" file > file
    Единственного не понял, если в начале регулярного выражения ставишь символ ^ а в конце $ почему-то выходит пустой файл.
     
    #6 Tmye, 7 Jan 2017
    Last edited: 7 Jan 2017
  7. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    потому что символ ^ обозначает начало строки, а $ конец, соответственно, чтобы твоя регулярка сработала, текст в файле xml должен быть такого вида:
    Code:
    118.192.160.147
    39.177.186.8
    14.154.17.140
    118.192.184.18
    что не будет иметь смысла в итоге
     
  8. mozomig

    mozomig New Member

    Joined:
    28 Dec 2016
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    За 2 минуты наколякал на С++, pugixml. Вот сорсы и exe - шник скомпилированный под x64.
    Если надо что подправить пиши.
    запускать через cmd:
    ParserXML.exe source.xml result.txt
    source.xml - сам сорец
    result.txt - имя файла куда всё складывать.

    http://rgho.st/6Rw9wZ9Y8
     
  9. SipSik

    SipSik New Member

    Joined:
    8 Nov 2017
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Вот подскажите меня тоже самое интересует но только с сохранением порта. Сканирую диапозоны и порт мне очень нужен.
     
  10. SipSik

    SipSik New Member

    Joined:
    8 Nov 2017
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Можешь поправить чтобы порт сохранялся ?
     
  11. SipSik

    SipSik New Member

    Joined:
    8 Nov 2017
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Все на много проще
    masscan -iL ranges.txt -p3389 --rate=10000 |awk '{print $6}' = result.txt
    И не каких лишних действий чистый файл с IP.
    Это для автора поста.
    А мне кто нибудь сможет помочь? )
    Мне нужно именно проработать файл, в идеале было бы через grep прямо в линуксе.
    Помогите!!!!!
     
  12. SipSik

    SipSik New Member

    Joined:
    8 Nov 2017
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Помогите пожалуйста!!!! Как сделать результат с портом?????
     
Loading...