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 ?
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 :
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.
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
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) ?
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…
j’aurais dû le voir plus tôt.
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.
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) )