Autore Topic: regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)  (Letto 3588 volte)

Offline faustf

  • Gambero
  • **
  • Post: 87
    • Mostra profilo
Buon di a tutti
ho un testo fatto cosi
Codice: [Seleziona]
Starting Nmap 7.01 ( https://nmap.org ) at 2018-01-07 15:45 CET
Nmap scan report for 192.168.1.1
Host is up (0.014s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server
MAC Address: 00:A0:A2:A9:32:C8 (Digicom)

Nmap scan report for 192.168.1.25
Host is up (0.14s latency).
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server
MAC Address: 80:1F:02:8E:4F:9B (Edimax Technology)

Nmap scan report for 192.168.1.103
Host is up (0.18s latency).
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server
MAC Address: 80:1F:02:8E:4F:9B (Edimax Technology)

Nmap scan report for 192.168.1.105
Host is up (0.44s latency).
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server
MAC Address: 80:1F:02:8E:4F:9B (Edimax Technology)

Nmap scan report for 192.168.1.114
Host is up (0.21s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server
MAC Address: 30:10:B3:2A:18:33 (Liteon Technology)

Nmap scan report for 192.168.1.120
Host is up (0.17s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server
MAC Address: 10:60:4B:E0:B1:1C (Hewlett Packard)

Nmap scan report for 192.168.1.101
Host is up (0.00015s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server

Nmap done: 256 IP addresses (7 hosts up) scanned in 31.96 seconds

l idea è: voglio prendere i numeri ip e la penultima stringa di ogni blocco cioè 3389/tcp ..........
ho  fatto una cosa del genere per fare quanto detto
Codice: [Seleziona]
 rMatch = New RegExp(Result, "for\\d*.\\d*.\\d*.\\d*.\\d*")
    rMatchPort = New RegExp(Result, "3389/tcp .*")
ora gambas ovviamente prenderà solo il primo ip e il primo 3389/tcp
la domanda è: esiste un metodo che possa fare tipo un  globalmatch  di tutto e restituirmi  il tutto su un array ??
ho devo per forza di cose   mettere tutto in un ciclo ,  fare prima il compile e poi l exec ??
grazie a tutti


« Ultima modifica: 07 Gennaio 2018, 16:28:01 da faustf »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #1 il: 07 Gennaio 2018, 17:05:30 »
Bada io non sono certo un esperto di RegExp, ma so che gb.pcre è basato sulla libreria pcre2 e qui trovi la documentazione

Credo comunque che tu debba seguire l'esempio della wiki di Gambas.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline faustf

  • Gambero
  • **
  • Post: 87
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #2 il: 07 Gennaio 2018, 19:22:23 »
avevo pensato anchio a quello ma infondo al cuore speravo fosse piu semplice  :D
ok  gli darò un occhiata

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #3 il: 07 Gennaio 2018, 19:27:05 »
Non so se quanto riporto è un modo corretto di usare un suggerimento degli ideatori del componente, vedi tu se va bene. Ripeto io non sono esperto di espressioni regolari e mi sono basato su i tuoi pattern:

Codice: [Seleziona]
Public Sub Main()

  Dim sFile, sPat1, sPat2 As String
  Dim ss1, ss2 As String[]
  Dim i As Integer
  ' Ho copiato quello che hai postato in un file di testo sulla mia Scrivania
  ' comunque sia l'importante è che sFile contenga il testo da ciclare.'
  sFile = File.Load("~/Scrivania/Testo.text")
  sPat1 = "for +(\\d*.\\d*.\\d*.\\d*.\\d*)"
  sPat2 = "3389/tcp .*"
  ss1 = GRX(sPat1, sFile, 1)
  ss2 = GRX(sPat2, sFile, 0)
  If ss1.Count = ss2.Count Then
    For i = 0 To ss1.Max
      Print ss1[i]; " -- "; ss2[i]
    Next
  Endif
  '...'

End

Private Function GRX(pattern As String, subject As String, pos As Integer) As String[]

  Dim re As New Regexp
  Dim matches As New String[]
  Dim tmp As String

  tmp = subject
  re.Compile(pattern)
  re.Exec(tmp)
  Do While re.text <> ""
     matches.add(re[pos].text)
    tmp = Mid(tmp, re.offset + 2)
    re.Exec(tmp)
  Loop
  Return matches

End

 :ciao:

P.S. Così è meglio
« Ultima modifica: 07 Gennaio 2018, 22:22:32 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #4 il: 07 Gennaio 2018, 20:52:24 »
l idea è: voglio prendere i numeri ip e la penultima stringa di ogni blocco cioè 3389/tcp ..........

Poiché v'è una sequenza costante delle righe, io proverei ad utilizzare la funzione nativa "Scan( )" all'interno di un ciclo.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline faustf

  • Gambero
  • **
  • Post: 87
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #5 il: 08 Gennaio 2018, 01:43:20 »
il problema  è il ciclo  che è variabile dipende dalla rete che hai  quindi come fai a  dirgli sacansiona dall inizio alla fine ???
piu  mi sbatto con gambas e  piu mi  piglia male  sarò  sincero ,   mi  piacerebbe  imparare a programmare con linux ma mi rendo conto che ha  degli strumenti di sviluppo veramente rudimentali non so come facciano a svilupparci sopra , riconosco che chi lo fa è  un genio e un eroe  allo steso tempo  ,  parlo in senso generale , ho provato perl  ed  era ottimo come linguaggio il problema è  le gui , per interfacciarlo  , prima devi costruire una  gui con glade , che  è  un inferno in terra , per via dei container (di m....) allora mi son detto troviamo un  linguaggio semplice ma che abbia per lo meno la possibilita di disegnare le gui , e sto provando gambas , ( e  già se usi ad esempio un frame e ci metti dentro dei bottoni e provi a spostarlo non sposta i  bottoni e  li lascia dove sono) ,ma  va be  si può  soprassedere rispetto a glade-hell  va  bene lo stesso è già accettabile ma sta storia dele regexp mi cascano le braccia , ciò uno sconforto esagerato :rolleyes: :o ,  con  Autoit basta una linea di codice 
Codice: [Seleziona]
Local $aArray = StringRegExp('<test>a</test> <test>b</test> <test>c</Test>', '(?i)<test>(.*?)</test>', $STR_REGEXPARRAYFULLMATCH)
con  questo $STR_REGEXPARRAYFULLMATCH  lui sa che deve fare il lavoro globalmente  , tanto semplice spero che un giorno Benoît Minisini o chi per lui possa inserire un opzione del genere tutto il mondo gambas  gliene sarebbe grato ...... scusate per lo sfogo ,  ma in VB.net è uguale la cosa??? , ringrazio per la possibile soluzione  che studierò , e  mi studierò puer questo Scan per vedere  bene se può fare al caso
grazie ancora torno ad impazzire  notte a tutti

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #6 il: 08 Gennaio 2018, 02:07:42 »
mi  piacerebbe  imparare a programmare con linux ma mi rendo conto che ha  degli strumenti di sviluppo veramente rudimentali non so come facciano a svilupparci sopra
Scusa la mia ignoranza al riguardo, ma quanti linguaggi di programmazione possono essere utilizzati in Linux ?
Io ho sentito dire (ma purtroppo non so se è vero) che in Linux si può programmare anche in C, C++, Java, Python, Ruby, LUA, MatLab, Lazarus, HTML. Io, però, sinceramente non sono la persona adatta per dire se questi linguaggi siano rudimentali o avanzati.



spero che un giorno Benoît Minisini o chi per lui possa inserire un opzione del genere
Iscrivendoti nella Mailing List internazionale ufficiale potrai tu stesso richiedergli quel tipo di soluzione.



il problema  è il ciclo  che è variabile dipende dalla rete che hai  quindi come fai a  dirgli sacansiona dall inizio alla fine ???
Partiamo da qui:
come ottieni quelle righe che hai inserito come esempio nel tuo primo messaggio sopra ?
« Ultima modifica: 08 Gennaio 2018, 02:15:05 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline faustf

  • Gambero
  • **
  • Post: 87
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #7 il: 08 Gennaio 2018, 09:58:57 »
il problema non è la  quantità di linguaggi o il inguaggio che usi è che alla fine  ti scontri sempre(se vuoi una GUI) con dei tools vedi glade o wxwidget , che fanno uso dei container , e per mettere una listview  un textbox e un bottone , come vuoi tu , devi smattare  4  giorni per poi accontentarti .

non credo mi considererà , ma mai dire mai :)

le righe le ottengo da nmap -T4 -p3389 192.168.1.1/24 , quindi dipende da quane macchine ho  accese o meno al momento della scansione sulla rete


Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #8 il: 08 Gennaio 2018, 10:24:53 »
è che alla fine  ti scontri sempre(se vuoi una GUI) con dei tools
Forse dipende dalle librerie grafiche utilizzate.



le righe le ottengo da nmap -T4 -p3389 192.168.1.1/24 , quindi dipende da quane macchine ho  accese o meno al momento della scansione sulla rete
Hai fatto qualche esempio di prova con Gambas per ottenere quelle righe ?
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline faustf

  • Gambero
  • **
  • Post: 87
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #9 il: 08 Gennaio 2018, 11:03:02 »
il codice è
Codice: [Seleziona]
 Dim Result As String
  Dim GetwayIP As String
  Dim Getway As String
  Dim rMatch As RegExp
  Dim rMatchPort As RegExp
  Dim IP As String
  Dim Element As Integer
 
 If TextBox1.Text = "" Then
    Message.Error("Errore devi inserire la pass di root se vuoi che funzioni, Ciao!")
    Else
    Shell "(/sbin/ip route | awk '/default/ { print $3 }')" To GetwayIP
    Getway = Trim(GetwayIP)
     'Print Getway & "/24 "
     'Print "echo " & TextBox1.Text & " | sudo -S nmap -T4 -p3389 " & Getway & "/24 "
     
    Shell "echo " & TextBox1.Text & " | sudo -S nmap -T4 -p3389 " & Getway & "/24 " To Result
    Print Result
   
    rMatch.Compile("for\\d*.\\d*.\\d*.\\d*.\\d*", RegExp.MultiLine)
    rMatch.Exec(Result)
   ' rMatch = New RegExp(Result, "for\\d*.\\d*.\\d*.\\d*.\\d*")
    rMatchPort = New RegExp(Result, "3389/tcp .*")
Print rMatch.Count

    For Each Element In rMatch
    ip = Left$(rMatch[Element].Text, -4)
   ' ip = Right$(ip, -1)
   
   
    If rMatchPort[Element].Text <> "3389/tcp closed ms-wbt-server" Then
       Print ip
    Endif
    Next

   ' Print ip & rMatchPort[0].Text
     
     
     
      'Print rMatch
  Endif
'
 
ma il  codice postato da  Gianluigi credo sia la "soluzione migliore" , anche se per fare una cosa che gli altri linguaggi impiegano due righe  ci tocca farne una biga in piu,   >:( :evil:
N.B: nel mio codice ho un errore null object , che bo

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #10 il: 08 Gennaio 2018, 12:04:42 »
nel mio codice ho un errore null object
Dove con precisione ?
« Ultima modifica: 10 Gennaio 2018, 02:41:25 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #11 il: 08 Gennaio 2018, 13:56:17 »
Ho scritto questo codice inserendo le tue righe in un file di testo:

Codice: [Seleziona]
Public Sub Main()

  Dim car As String
  Dim num, ss As String[]
  Dim b As Byte
 
' Carico il contenuto del file in una variabile stringa:
   car = File.Load("/tmp/a")
   
' Ciascuna riga del testo viene caricata in un distinto elemento di un vettore di tipo stringa:
   ss = Split(car, "\n")
   
' Individuo le righe utili e ne estrapolo i dati che mi interessano:
   For b = 1 To ss.max - 1 Step 3
     If ss[b] Begins "Nmap" Then
      Write Scan(ss[b], "*for *")[1]
     Else
      Write " - " & ss[b] & "\n"
     Endif
   Next

End
« Ultima modifica: 12 Gennaio 2018, 17:04:46 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #12 il: 08 Gennaio 2018, 15:53:04 »
Io la so così ma non è che sia molto ferrato nel campo.
Le espressioni regolari hanno motivo di essere usate sulle grandi quantità di dati.
Altrimenti va benissimo qualunque sistema alternativo.
Nel concreto per estrarre qualche decina di dati il codice che ho postato è inutile ma se si tratta di estrarne qualche migliaio o più allora ci si rende conto della differenza e della potenza delle regexp.

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #13 il: 08 Gennaio 2018, 16:27:31 »
... ma se si tratta di estrarne qualche migliaio o più allora ci si rende conto della differenza e della potenza delle regexp.
Be', certo, il lavoro lo fai fare al C.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
« Risposta #14 il: 08 Gennaio 2018, 16:35:39 »
... ma se si tratta di estrarne qualche migliaio o più allora ci si rende conto della differenza e della potenza delle regexp.
Be', certo, il lavoro lo fai fare al C.

Non voleva assolutissimamente essere una critica al tuo codice, molto interessante come al solito.  :)
E poi non so neanche se il mio codice sia valido dal punto di vista del componente gb.pcre 
Probabilmente c'è un'espressione per estrarre entrambi i dati nello stesso passaggio ma io ci capisco poco :-\
 :ciao:
« Ultima modifica: 08 Gennaio 2018, 16:46:17 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro