Gambas France BETA


Pas de compte ? Incription

Parsing

Ce sujet est résolu.

12
AuteurMessages
pierrotlo#1 Posté le 14/11/2015 à 15:44:21
Bonjour tous.
Voilà le problème :
Après un Shell, j'ai ceci dans la variable return

/dev/sda1 46296528 18106420 25815328 42% /
...
etc.

En fait plusieurs lignes. Je veux les parser en ne conservant que.. par exemple :

/dev/sda1
et
42%
et la partition /
Et je suis emprunté.
Une idée ?

Bien à tous, en vous remerciant
Reivillo#2 Posté le 14/11/2015 à 15:57:30
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »Bonjour pierrolo.

Regarde les Fonctions sur les chaînes de caractères ICI

Reivillo.
Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
Reivillo#3 Posté le 14/11/2015 à 17:14:30
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »En mettant dans un tableau, l'exemple ci-dessous devrait te donner une idée. ;)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PUBLIC SUB Form_Open()

DIM $sShell AS STRING
DIM $aTab AS String[]

SHELL "set `df | sed '1d'`; echo $@" TO $sShell
PRINT $sShell
$aTab = Split($sShell, " \n")
PRINT $aTab[0], $aTab[4], $aTab[5] 'ect...
PRINT "Ou bien"
PRINT $aTab[0]
PRINT $aTab[4]
PRINT $aTab[5]
'ect...

END
Fait nous un Retour si tu y as trouvé ton bonheur.
Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
linuxos#4 Posté le 14/11/2015 à 17:22:51
Un peu de sel, de poivre et la crevette sera... Bonjour,
Il y a justement un exemple concernant ton problème fourni avec le composant gb.pcre dans la documentation de Gambas3.
C'est ici: Composant gb.pcre

Je reconnais que l'utilisation des expressions régulières est un peu abrupte mais c'est vraiment super efficace.
De plus pour tester mes expressions avant de les utiliser dans Gambas, je m'exerce sur ce site web: https://regex101.com

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
Reivillo#5 Posté le 14/11/2015 à 17:56:24
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »@ pierrotlo.

J'ai modifié le Code à ton cas précis.

@ linuxos... ;)
Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
pierrotlo#6 Posté le 15/11/2015 à 11:27:40
Salut tous,

Voilà ce que j'obtiens .
Cela fonctionne parfaitement. La commande Shell donnée par Reivillo me renvoyait un résultat le tout mais sans ligne. Donc plus complexe à parser

Voilà le code. Il y'a sans doute un moyen plus simple d'éviter le filtrage de la variable tempLine. Toute les suggestion sont bonnes

Public Sub getHdd()
Dim Result As String
Dim commande As String
Dim i As Integer

Dim tempLine As String[]
Dim endArray As New String[]
Dim Tab As String[]

'Shell command
commande = "df"
Shell commande Wait To Result
Print Result
Tab = Split(Result, "\n")

'pour vérification
Print Tab[1]
'array temporaire
tempLine = Split(Tab[1], " ")

For i = 0 To tempLine.count - 1
'filtrer dans l'array les chaîne vide. Tabulateur ???
If tempLine <> "" Then
endArray.add(tempLine)
End If
Next

Print endArray[0]
Print endArray[1]
Print endArray[2]
Print endArray[3]
Print endArray[4]
Print endArray[5]

End
pierrotlo#7 Posté le 15/11/2015 à 11:34:00
Pour mémoire, ce programme me permet d'utiliser des commandes bash rapidement comme l'utilisation de pdftk pour les PDF ou l'extraction audio d'une vidéo ou encore la commande 'find'.

L'utilité de ce logiciel est aussi de faciliter la vie de mes clients (je n'installe et ne travaille que sous Linux exclusivement). Ils ne sont pas forcément adepte du terminal. MAis vu que c'est puissant, je ne vois pas vraiment comment les en priver ;)
Reivillo#8 Posté le 15/11/2015 à 14:30:03
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PUBLIC SUB Form_Open()

DIM $sShell AS STRING
DIM $asTab AS String[]
DIM $iFor AS INTEGER

SHELL "set `df | sed '1d'`; echo $@" TO $sShell
PRINT $sShell
$asTab = Split($sShell, " \n")
FOR $iFor = 0 TO ($asTab.count / 6) - 1
PRINT "----------------------------------------"
PRINT $asTab[($iFor * 6) + 0]
PRINT $asTab[($iFor * 6) + 4]
PRINT $asTab[($iFor * 6) + 5]
NEXT

END
Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
pierrotlo#9 Posté le 15/11/2015 à 16:37:30
Ah Pas mal c'est plus concis.

Je pense que je me suis laissé avoir par le terminal qui m'affichait le tout en un bloc losrque je l'avais lancé. Je ne saisi pas pourquoi la console me les donne en brut~$ set `df | sed '1d'`; echo $@

/dev/sda1 46296528 18105484 25816264 42% / none 4 0 4 0% /sys/fs/cgroup udev 8121692 4 8121688 1% /dev tmpfs 1627536 1920 1625616 1% /run none 5120 0 5120 0% /run/lock none 8137672 104944 8032728 2% /run/shm none 102400 24 102376 1% /run/user /dev/sda7 49663724 4381824 42736084 10% ... etc.
MAis bon je regarde
Merci pour tout. JE reviendrait vers vous
Reivillo#10 Posté le 15/11/2015 à 16:45:22
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »Ou si tu veux traiter ligne par ligne:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PUBLIC SUB Form_Open()

DIM $sShell, $sTmp AS STRING
DIM $asLine, $asTab AS String[]
DIM $iFor AS INTEGER

SHELL "df | sed '1d'" TO $sShell
$asLine = Split($sShell, "\n", "", TRUE)
FOR $iFor = 0 TO $asLine.Count - 1
SHELL "set " & $asLine[$iFor] & " ;echo $@" TO $sTmp
PRINT "==============================="
$asTab = Split(Trim$($sTmp), " ")
PRINT $asTab[0]
PRINT $asTab[4]
PRINT $asTab[5]
NEXT

END
Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
Reivillo#11 Posté le 15/11/2015 à 16:52:11
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »Si nécessaire je peux te commenter les lignes de codes.
Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
pierrotlo#12 Posté le 15/11/2015 à 21:13:40
Je te remercie.
Mais si j'utilise très souvent les lignes bash, notament pour tout ce qui est réseau. sed me reste largement inconnu.
LE code, je le comprend bien.
Ce que je ne saisi pas c'est
"set `df | sed '1d'`; echo $@"
comparativement à
df | sed '1d'
qui si je fait lacommande, me donne exactement la mêmme chose que :

df tout court
Reivillo#13 Posté le 16/11/2015 à 12:40:09
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »@ pierrotlo.
"df | sed '1d'"
Ici, on passe le Flux df à sed qui lui, supprime la 1ère ligne avec sa commande '1d'
"set `df | sed '1d'`; echo $@"
Là! C'est une astuce, pour s'affranchir des espaces inutiles et consécutifs. J'utilise set variable argument. Quant a $@, elle liste les arguments initiés précédemment avec set.

Personnellement, j'utilise surtout Gambas3 pour faire des affichage graphique à mes scripts bash.
Mais là... :silent: Il y a peut-être des puristes dans la salle... ;)
comparativement à
df | sed '1d'
qui si je fait lacommande, me donne exactement la mêmme chose que :
df tout court
Ben non. Si tu regardes bien: df retourne toutes les lignes de df, alors que df | sed '1d' retourne les lignes de df, amputée de la 1ère.
Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
pierrotlo#14 Posté le 16/11/2015 à 22:36:42
Vu et je te remercie du fond du coeur.
Je vais noter cette commande.

Je l'ai essayée aussi avec arp-scan :

Exemple : sudo arp-scan --localnet

Sauf si tu as plusieurs interface réseau on doit préciser :

sudo arp-scan --interface=eth1 --localnet

Shell "set `sudo arp-scan --interface=eth1 --localnet | sed '1d'`; echo $@" To $sShell
$asTab = Split($sShell, " \n")

Dans ce cas là ben cela ne fonctionne pas. Je n'ai plus que la résultat sur une seule ligne. A croire qu'il n'existe pas de "\n"

si jamais je suis sous Linux Mint Rafaella et il faut faire un sudo apt-get install arp-scan
Pour l'exemple, j'ai autorisé dans /etc/sudoers mon utilisateur à lancer la commande arp-scan sans password.
Reivillo#15 Posté le 17/11/2015 à 08:44:06
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »@ pierrotlo.

Shell "set `sudo arp-scan --interface=eth1 --localnet | sed '1d'`; echo $@" To $sShell
$asTab = Split($sShell, " \n")

Dans ce cas là ben cela ne fonctionne pas. Je n'ai plus que la résultat sur une seule ligne. A croire qu'il n'existe pas de "\n"

Là évidemment ! Il faut se rappeler que la commande set n'enregistre que des Mots entiers, et donc fait fi des Caractères Nuls et Espaces.
Les caractères Nuls allant de 0 à 31 en décimal. Le "\n" étant le 10, il passe donc à la trappe.
En plus dans ton cas, avec l'exemple arp-scan, il faut en plus Supprimer les parenthèses dans le flux de sortie.
Je te remets le code modifié en conséquence, qui comme celui du message Posté le 15/11/2015 à 16:45 traite le flux ligne après ligne.
Ici la multi-commande sed '1d; s/(//g; s/)//g'. Supprime la 1ère ligne 1d, puis les parenthèses ouvrantes s/(//g et fermantes s/)//g.
Pour le reste, je te laisse l'adapter à tes desiderata... ;)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PUBLIC SUB Form_Open()

DIM $sShell, $sTmp AS STRING
DIM $asLine, $asTab AS String[]
DIM $iFor, $iFor2 AS INTEGER

SHELL "sudo arp-scan --interface=eth1 --localnet | sed '1d; s/(//g; s/)//g'" TO $sShell
$asLine = Split($sShell, "\n", "", TRUE)
FOR $iFor = 0 TO $asLine.Count - 1
SHELL "set " & $asLine[$iFor] & "; echo $@" TO $sTmp
PRINT "==============================="
PRINT $sTmp
$asTab = Split(Trim$($sTmp), " ")
FOR $iFor2 = 0 TO $asTab.Count - 1
PRINT $asTab[$iFor2]
NEXT
NEXT

END

Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
12