utilisation de la commande awk dans un script shell

utilisation de la commande awk dans un script shell - Shell/Batch - Programmation

Marsh Posté le 18-04-2008 à 11:53:44    

Bonjour,
Je veux récupérer un mot dans un fichier. la commande awk me renvoie toute la ligne qui contient le mot en question.
 
ex contenu fichier:
micurui testkfj jfjk
oytutu kbkllk
 
ce que je veux c récupérer uniquement le mot testkfj mais je précise que je connais uniquement le début du mot. la commande awk '/test/' test.txt | cut -d" " -f2 marche mais là c'est parce que je connais la colonne où trouver la donnée (ce qui n'est pas le cas normalement). On m'a parlé des expressions régulières mais je vois pas comment les utiliser.  :sweat:

 

merci pour votre aide


Message édité par mic_12 le 18-04-2008 à 11:53:58
Reply

Marsh Posté le 18-04-2008 à 11:53:44   

Reply

Marsh Posté le 18-04-2008 à 17:45:25    

Ta commande awk, telle qu'elle est codée, fait exactement la même chose qu'un grep c'est à dire qu'elle te renvoie toutes les lignes contenant la chaîne de caractéres test.
 
Si tu veux obtenir tous les mots commençant par test dans ton fichier, tu peux faire :

Code :
  1. awk '
  2. {
  3.    for (i=1; i<=NF; i++)
  4.       if ($i ~ /^test/)
  5.          print $i;
  6. }
  7. ' fichier

Si c'est le premier mot trouvé qui t'intéresse :

Code :
  1. awk '
  2. {
  3.    for (i=1; i<=NF; i++)
  4.       if ($i ~ /^test/) {
  5.          print $i;
  6.          exit;
  7.       }
  8. }
  9. ' fichier


 
Jean-Pierre.


Message édité par aigles le 19-04-2008 à 22:33:57
Reply

Marsh Posté le 19-04-2008 à 18:56:56    

salut aigles. Merci pour ta réponse.  :)
Encore une petite question. Le NF dans ton if, c'est le nombre de lignes?

Reply

Marsh Posté le 19-04-2008 à 22:32:52    

mic_12 a écrit :

salut aigles. Merci pour ta réponse.  :)
Encore une petite question. Le NF dans ton if, c'est le nombre de lignes?

Non, il s'agit du nombre de champs.
 
Jean-Pierre.

Reply

Marsh Posté le 21-04-2008 à 08:56:53    

Grep est ton ami:
 

grep -o 'test[[:alnum:]]*' fichier.txt

Reply

Marsh Posté le 21-04-2008 à 09:49:10    

chaica a écrit :

Grep est ton ami:
 

grep -o 'test[[:alnum:]]*' fichier.txt


Cette option est bien intéressante mais elle n’est malheureusement pas disponible avec toutes les versions de grep.
De plus, elle ne résout pas complètement le problème elle ne travaille pas au niveau des champs.
L'option -w permet de travailler au niveau des mots, mais la définition du mot est différente de celle du champ; tout dépend donc de ce que l’on souhaite obtenir.
 
 
$ cat test.dat
Ceci est un petit test
Nous detestons ce parfum
Un denier petit test, pour la route ...
$ grep -o 'test[[:alnum:]]*' test.dat
test
testons
test
$ grep -wo 'test[[:alnum:]]*' test.dat
test
test
$ awk '
> {
>    for (i=1; i<=NF; i++)
>      if ($i ~ /^test/)
>         print $i;> }
> ' test.dat
test
test,
$
 
Jean-Pierre.

Reply

Marsh Posté le 21-04-2008 à 10:32:35    

aigles a écrit :

Cette option est bien intéressante mais elle n’est malheureusement pas disponible avec toutes les versions de grep.
De plus, elle ne résout pas complètement le problème elle ne travaille pas au niveau des champs.
L'option -w permet de travailler au niveau des mots, mais la définition du mot est différente de celle du champ; tout dépend donc de ce que l’on souhaite obtenir.
 
 
$ cat test.dat
Ceci est un petit test
Nous detestons ce parfum
Un denier petit test, pour la route ...
$ grep -o 'test[[:alnum:]]*' test.dat
test
testons
test
$ grep -wo 'test[[:alnum:]]*' test.dat
test
test
$ awk '
> {
>    for (i=1; i<=NF; i++)
>      if ($i ~ /^test/)
>         print $i;> }
> ' test.dat
test
test,
$
 
Jean-Pierre.


 
Si tu changes l'énoncé de départ, à savoir le fichier

micurui testkfj jfjk
oytutu kbkllk


 
Je change mon grep également:

grep -o '\btest[[:alnum:]||[:punct:]]*' fichier.txt

Reply

Marsh Posté le 21-04-2008 à 14:55:20    

nan mais t'enflammes pas chaica, j'ai pas l'option -o de toute facon. :whistle:  
Je l'avais testé (et découvert) sous linux mais là c'est pas sous linux  :)

Reply

Marsh Posté le 21-04-2008 à 14:57:35    

merci pour le awk, aigles, il marche à merveille.  :)
juste encore une ou deux questions.  :whistle:
le tilde (~) ca signifie quoi au juste? Ou est ce que je peux trouver de la doc pour connaitre toutes ces "subtilités" du shell?

Message cité 1 fois
Message édité par mic_12 le 21-04-2008 à 14:57:45
Reply

Marsh Posté le 21-04-2008 à 20:28:34    

mic_12 a écrit :

merci pour le awk, aigles, il marche à merveille.  :)  
juste encore une ou deux questions.  :whistle:  
le tilde (~) ca signifie quoi au juste? Ou est ce que je peux trouver de la doc pour connaitre toutes ces "subtilités" du shell?


 
Le tilde en shell (en bash pour être précis) correspond à ton HOME et "~user" correspond au HOME de user. Mais dans l'exemple de aigles, le tilde est une instruction awk et non du shell (en fait c'est le programme awk qui analyse l'ensemble de tout ce qui est entre '{...}' ) donc faut aller voir la doc awk => man awk


---------------
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