capture filre AWK

capture filre AWK - Shell/Batch - Programmation

Marsh Posté le 31-08-2006 à 14:39:29    

Hello,
 
J'ai encore un petit souci avec AWK,
 
j'arrive pas à capture le resultat d'un filtre, je m'explique:
 
aaaaaaa|bbbbbbb;context=abchgfhgf//ddddd 11111 2222 3333
 
si je veux récupérer la chaine abchgfhgf en faisaint un filtre;
sachant la valeur que peut prend le contexte change tout le temps et n'ai pas de la meme longueur ,est possible?
je veux donc capturer cette valeur de facon a ce que print $1 m'affiche : abchgfhgf
 
un peu à la perl en fait :)
 
j'ai l'impression que en awk, on ne peut pas capturer un morceau de chaine, $x ne prend que des valeurs de champs.
 
merci d'avance.

Message cité 1 fois
Message édité par clancy le 31-08-2006 à 14:43:53
Reply

Marsh Posté le 31-08-2006 à 14:39:29   

Reply

Marsh Posté le 31-08-2006 à 14:52:35    

clancy a écrit :

Hello,
 
J'ai encore un petit souci avec AWK,
 
j'arrive pas à capture le resultat d'un filtre, je m'explique:
 
aaaaaaa|bbbbbbb;context=abchgfhgf//ddddd 11111 2222 3333
 
si je veux récupérer la chaine abchgfhgf en faisaint un filtre;
sachant la valeur que peut prend le contexte change tout le temps et n'ai pas de la meme longueur ,est possible?
je veux donc capturer cette valeur de facon a ce que print $1 m'affiche : abchgfhgf
 
un peu à la perl en fait :)
 
j'ai l'impression que en awk, on ne peut pas capturer un morceau de chaine, $x ne prend que des valeurs de champs.
 
merci d'avance.


awk utilise par défaut l'espace pour séparer ses champs. Toi, tu as 2 séparateurs: le "=" avant et le "/" après. Je ne pense pas que "awk" sache utiliser 2 séparateurs à la fois...
Moi, je le ferais avec "cut"

echo "$valeur_complete" |cut -d= -f2 |cut -d/ -f1



---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 31-08-2006 à 18:22:24    

echo $var | awk -F= '{ split($2,arr,"//" ) ; print arr[1]}'


Par exemple.


---------------
Institutions européennes: Ensemble d'outils dont le but est de transformer une grande quantité d'argent en merde. Cette merde est utilisée pour créer de nouveaux fonctionnaires. L'argent restant payant des externes pour faire leur travail.
Reply

Marsh Posté le 31-08-2006 à 20:05:33    

La valeur du séparateur de champ FS peut être une expression réguliere.
Dans ton cas on peut définir définir FS comme étant '=' ou '//'.

echo $var | awk -F'=|//' '{print $2}'


Cette solution a bien sur ses limites, par exemple il ne faut pas qu'il y ait '//' avant '='. On peut être un peu plus précis, en spécifiant 'context=|//' pour FS.
 
 
Jean-Pierre.
 
Modif: Ajout awk manquant.


Message édité par aigles le 02-09-2006 à 12:16:04
Reply

Marsh Posté le 01-09-2006 à 07:35:14    

aigles> Tu as oublié le "awk" dans ta commande ;)
Sinon je ne connaissais pas le mutli FS, ça pouvait être sympa mais hélas ça ne semble pas être un standard awk. En tout cas awk et nawk Solaris n'en veulent pas :/


---------------
Institutions européennes: Ensemble d'outils dont le but est de transformer une grande quantité d'argent en merde. Cette merde est utilisée pour créer de nouveaux fonctionnaires. L'argent restant payant des externes pour faire leur travail.
Reply

Marsh Posté le 02-09-2006 à 12:28:02    

Deadlock a écrit :

aigles> Tu as oublié le "awk" dans ta commande ;)


Correction effectuée  :sweat:  

Citation :

Sinon je ne connaissais pas le mutli FS, ça pouvait être sympa mais hélas ça ne semble pas être un standard awk. En tout cas awk et nawk Solaris n'en veulent pas :/


Que awk ne gére pas les ERE pour FS ne me semble pas impossible, par contre en ce qui concerne nawk ça m'étonne beaucoup.
Sur AIX il n'y a pas de problème, de même sous Windows avec gawk et mawk .
J'ai trouvé le man de nawk pour Solaris sur le Net. Il est bien indiqué que l'option -F est une ERE.

NAME
     nawk - pattern scanning and processing language
 
SYNOPSIS
     /usr/bin/nawk   [-F ERE]   [-v assignment]    'program'    |
     -f progfile... [argument...]
 
     /usr/xpg4/bin/awk [-F ERE]  [-v assignment...]  'program'  |
     -f progfile... [argument...]
 
DESCRIPTION
     The /usr/bin/nawk and  /usr/xpg4/bin/awk  utilities  execute
     programs  written in the nawk programming language, which is
     specialized for textual data manipulation. A nawk program is
     a sequence of patterns and corresponding actions. The string
     specifying program must be enclosed in single quotes (')  to
     protect  it  from interpretation by the shell.  The sequence
     of pattern - action statements can be specified in the  com-
     mand  line  as program or in one, or more, file(s) specified
     by the -f progfile option. When input is read that matches a
     pattern,  the  action  associated  with  the pattern is per-
     formed.
 
     Input is interpreted as a sequence of records. By default, a
     record  is  a  line, but this can be changed by using the RS
     built-in variable. Each record of input is matched  to  each
     pattern  in the program. For each pattern matched, the asso-
     ciated action is executed.
 
     The nawk utility interprets each input record as a  sequence
     of  fields  where,  by  default, a field is a string of non-
     blank characters. This default white-space  field  delimiter
     (blanks and/or tabs) can be changed by using the FS built-in
     variable or the -F ERE option. The nawk utility denotes  the
     first field in a record $1, the second $2, and so forth. The
     symbol $0 refers to the entire  record;  setting  any  other
     field  causes the reevaluation of $0. Assigning to $0 resets
     the values of all fields and the NF built-in variable.
 
OPTIONS
     The following options are supported:
 
     -F ERE
           Define the input field separator to  be  the  extended
           regular  expression ERE, before any input is read (can
           be a character).
. . . . . . . . .
 
EXAMPLES  
. . . . . . . . .
 
Example 12: Same, with input fields separated  by  comma  or
     space and tab characters, or both:
 
     BEGIN { FS = ",[\t]*|[\t]+" }
           { print $2, $1 }


 
 
 

Reply

Marsh Posté le 04-09-2006 à 09:20:59    

Effectivement. Ca va me "changer la vie" cette histoire ! Merci JP ;)
 

root@milan:[/root]# echo "test1,test2:test3//test4" | nawk -F',|:|[/]+[/]' '{ print $1 }'
test1
root@milan:[/root]# echo "test1,test2:test3//test4" | nawk -F',|:|[/]+[/]' '{ print $2 }'
test2
root@milan:[/root]# echo "test1,test2:test3//test4" | nawk -F',|:|[/]+[/]' '{ print $3 }'
test3
root@milan:[/root]# echo "test1,test2:test3//test4" | nawk -F',|:|[/]+[/]' '{ print $4 }'
test4
root@milan:[/root]# id | nawk -F'[(]|[)]' '{ print $2 }'  
root



---------------
Institutions européennes: Ensemble d'outils dont le but est de transformer une grande quantité d'argent en merde. Cette merde est utilisée pour créer de nouveaux fonctionnaires. L'argent restant payant des externes pour faire leur travail.
Reply

Marsh Posté le 04-09-2006 à 22:53:52    

Deadlock a écrit :

Effectivement. Ca va me "changer la vie" cette histoire ! Merci JP ;)
 

root@milan:[/root]# echo "test1,test2:test3//test4" | nawk -F',|:|[/]+[/]' '{ print $1 }'
test1
root@milan:[/root]# echo "test1,test2:test3//test4" | nawk -F',|:|[/]+[/]' '{ print $2 }'
test2
root@milan:[/root]# echo "test1,test2:test3//test4" | nawk -F',|:|[/]+[/]' '{ print $3 }'
test3
root@milan:[/root]# echo "test1,test2:test3//test4" | nawk -F',|:|[/]+[/]' '{ print $4 }'
test4
root@milan:[/root]# id | nawk -F'[(]|[)]' '{ print $2 }'  
root



Travailler directement sous le compte "root" c'est mal  :non:  

Reply

Marsh Posté le 04-09-2006 à 23:22:13    

Je me souviens du temps où j'étais jeune et insouciant, j'avais l'habitude de taper "kill -9 -1" sur mon linux perso pour me déconnecter. Et puis un jour j'ai pas fait gaffe, et je l'ai fait en temps que root.
SIGKILL sur le processus initd, alors que probablement il faisait plein de choses traÿ traÿ importantes...
 
... j'ai eu le droit de réinstaller mon système. [:klem3i1]
 
Voila, une anecdote de retour de vacances pour dire que bosser sous root çaÿ mal, et qui change un peu du traditionnel rm -rf [:dawa]

Message cité 1 fois
Message édité par Elmoricq le 04-09-2006 à 23:23:03
Reply

Marsh Posté le 05-09-2006 à 08:43:25    

Sve@r a écrit :

Travailler directement sous le compte "root" c'est mal  :non:

Quand tu travailles dans un environnement de plus de 300 hosts trustés par un seul, que 90% des commandes usuelles sont root only ... tu travailles en root crois moi. Mais bon entre les "bonnes manières scolaires" et la vraie vie ;) ...


---------------
Institutions européennes: Ensemble d'outils dont le but est de transformer une grande quantité d'argent en merde. Cette merde est utilisée pour créer de nouveaux fonctionnaires. L'argent restant payant des externes pour faire leur travail.
Reply

Marsh Posté le 05-09-2006 à 08:43:25   

Reply

Marsh Posté le 07-09-2006 à 23:32:58    

Elmoricq a écrit :

Je me souviens du temps où j'étais jeune et insouciant, j'avais l'habitude de taper "kill -9 -1" sur mon linux perso pour me déconnecter. Et puis un jour j'ai pas fait gaffe, et je l'ai fait en temps que root.
SIGKILL sur le processus initd, alors que probablement il faisait plein de choses traÿ traÿ importantes...
 
... j'ai eu le droit de réinstaller mon système. [:klem3i1]


Moi j'avais l'habitude de purger "/tmp" en faisant

cd /tmp
rm -fr * .*


 
Puis, un jour, j'ai voulu aller plus vite et j'ai tapé "rm -fr /tmp/* /tmp/.*" et là, le système m'a pas rendu la main. Ca a duré 20 secondes avant que je ne réalise que dans "/tmp/.*", il y avait aussi "/tmp/.."   [:rofl]


Message édité par Sve@r le 08-09-2006 à 09:38:03

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed