Хочу чтобы 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 что-то не получается.
Учиться кодить. Срочно. 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";
под винду на 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
Держи делфи: 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
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
Сделал даже лучше 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 Единственного не понял, если в начале регулярного выражения ставишь символ ^ а в конце $ почему-то выходит пустой файл.
потому что символ ^ обозначает начало строки, а $ конец, соответственно, чтобы твоя регулярка сработала, текст в файле xml должен быть такого вида: Code: 118.192.160.147 39.177.186.8 14.154.17.140 118.192.184.18 что не будет иметь смысла в итоге
За 2 минуты наколякал на С++, pugixml. Вот сорсы и exe - шник скомпилированный под x64. Если надо что подправить пиши. запускать через cmd: ParserXML.exe source.xml result.txt source.xml - сам сорец result.txt - имя файла куда всё складывать. http://rgho.st/6Rw9wZ9Y8
Вот подскажите меня тоже самое интересует но только с сохранением порта. Сканирую диапозоны и порт мне очень нужен.
Все на много проще masscan -iL ranges.txt -p3389 --rate=10000 |awk '{print $6}' = result.txt И не каких лишних действий чистый файл с IP. Это для автора поста. А мне кто нибудь сможет помочь? ) Мне нужно именно проработать файл, в идеале было бы через grep прямо в линуксе. Помогите!!!!!