AWK traiter le retour d'une page web

Bonjour,

J’ai une page Web qui me retourne une série de paramètres :

Dans un script bash je voudrais extraire les données puis les traiter.

Un début de code :

toto=`w3m -dump http://ip/test.php` echo $toto | awk -F"DATE = " '{print $2}'

Résultat : 20110824 TIME = 12592034

Le problème est que j’obtiens aussi le reste de la chaine. Est-il possible de mettre un séparateur de fin dans awk ?
Pour uniquement extraire le résultat que l’on veux ?

Merci

J’ai une solution avec sed :

champ='DATE' DATE=$(w3m -dump http://ip/test.php | sed 's/^.*'$champ' = \([^ ]\+\)\( .*\)\?$/\1/')

Alors l’expression va remplacer :
[ul]
[li]Ce qui commence par n’importe quoi ou rien : ^.* (^ = commencer, . = n’importe quel caractère, * = un nombre de fois quelconque (y compris 0 fois)[/li]
[li]suivie du champ choisi : $champ[/li]
[li]suivi de " = " (un égale suivi et précédé d’un espace)[/li]
[li]suivi de n’importe quel caractère sauf espace autant de fois que voulu une fois ou plus : [^ ]+ ([^ ] = tout caractère autre que l’espace, + au moins une fois)[/li]
[li]suivi d’un espace puis n’importe quoi : " .*"[/li][/ul]

Le premier couple de parenthèses va permettre de récupérer la chaîne (on le réutilise avec \1), le second sert à dire que le dernier “espace suivi de n’importe quoi” peu ne pas exister (cela permet de gérer les cas où le champ est en fin de ligne.

Je suis loin d’être un spécialiste de awk, et j’ai une solution moins jolie que celle de MisterFreeze ( à condition que tes logs aient toujours la même syntaxe ), mais je la poste quand même :

Bonjour MisterFreez :smiley:

J’ai essayé ta solution avec sed et cela fonctionne correctement :041
Merci pour les explications des différents param utilisés :dance:

Bonjour arnaud_k

Merci pour ton aide.

Le problème est que la syntaxe des champs peut changer…
Les champs sont dynamiques,donc dans mon cas cette solution n’est pas envisageable

salut,

pour rester dans le shell data=$(w3m -dump http://ip/test.php) data="${data#*DATE = }" data="${data%% *}" echo $data 20110824il ne s’agit pas de regex, mais de Remplacements de paramètres.

Salut,

Ton exemple ne fonctionne pas, il me retourne une chaine vide. :think:

sans le contenu avec lequel tu as testé ces remplacements, je n’en dirai pas plus :wink:

le contenu est la chaine de mon premier post :sunglasses:

bon, ben, pour moi ça marche, même sous dash.

[quote=“Watael”]salut,

pour rester dans le shell data=$(w3m -dump http://ip/test.php) data="${data#*DATE = }" data="${data%% *}" echo $data 20110824il ne s’agit pas de regex, mais de Remplacements de paramètres.[/quote]
En effet et ça peut se faire en une ligne ainsi :

data=$(w3m -dump http://ip/test.php) data="${${data#*DATE = }%% *}" echo $data 20110824
Mais j’aime bien les expressions régulières (les vraies ^^).

Je conseillerais la solution shell si la page ne renvoie que quelques lignes et sed si ça doit travailler sur de gros fichiers :slightly_smiling:

@Watael
J’utilise bash (debian squeeze)

@MisterFreez
J’ai une erreur de substitution sur ${${data#*DATE = }%% *}

:023

Bonjour à tous,
:-) $ toto="IP = 192.168.1.199 HOTSNAME = PC-A DATE = 20110824 TIME = 12592034" :-) $ echo $toto | awk -F"DATE = " '{print $2}' | awk '{print $1}' 20110824 :-) $
Et si le format des données est toujours le même, pourquoi ne pas utiliser le séparateur de champs par défaut (l’espace) ?

:-) $ echo $toto | awk '{print $9}' 20110824 :-) $

Un autre truc amusant :

:-) $ echo $toto | awk -F "DATE = " '{print substr($2,1,8)}' 20110824 :-) $
Ne fonctionne que si le champ à extraire est de longueur fixe. :wink:

Oui effectivement, bonne idée le substr !

MisterFreez a dit :[quote]En effet et ça peut se faire en une ligne ainsi :

data=$(w3m -dump http://ip/test.php) data="${${data#*DATE = }%% *}" echo $data 20110824[/quote]
seb a dit:[quote]@MisterFreez
J’ai une erreur de substitution sur ${${data#*DATE = }%% *}[/quote]moi aussi.
c’est normal : une variable dans une variable…avec des remplacements… :naughty:
j’aurais dû le voir plus tôt. :blush:

Il y a des jours qui me font rappeler pourquoi j’utilise zsh…

Du coup juste pour dire avec zsh on peut même faire ça :

OUi, très puissant le zsh, mais coté échange avec les autres codeurs et portabilité… C’est pas utilisé par tous le monde, loin de là.
Du coup, j’hésite à m’y mettre.

bonsoir,
ma contribution :

#si pas besoin des param positionnels :
set -- $(w3m -dump http://ip/test.php)
echo "$9"
#sinon
infos=( $(w3m -dump http://ip/test.php) )
echo "${infos[8]}"

Salut Totor,
Qu’est que tu entends par :
[quote]
#si pas besoin des param positionnels :
[/quote]
C’est en relation avec le – de la ligne commande ?

Pour la deuxième, chaque champ se retrouve dans une case du tableau. Mais peux-tu me rappeler l’utilité des parenthèses englobantes de l’expression :
( $(w3m -dump http://ip/test.php) )