grep et affiche la ligne suivante ..

grep et affiche la ligne suivante .. - Shell/Batch - Programmation

Marsh Posté le 02-01-2006 à 11:46:21    

Bonjour,
 
j'aurais vraiment besoin d'aide :  
 
je souhaite faire un GREP de toto dans un fichier  
 
et afficher la ligne juste en dessous
 
exemple du fichier :  
 
blablab titi
tytytytytyt
blablab toto
tututututut
 
 
je souhaite afficher tutuututut
 
vous voyez le truc ?
 
j'essai de faire un truc du genre : grep toto mon_fic | awk -v NR==NR+1 '{print $0}'
mais ca semble pas correct :p

Reply

Marsh Posté le 02-01-2006 à 11:46:21   

Reply

Marsh Posté le 02-01-2006 à 12:20:37    

grep -A ;)

Reply

Marsh Posté le 02-01-2006 à 13:13:07    

heu nan ca existe po -A :p
 
je précise que je suis pas sous linux mais Sun Solaris ...
 
d'autres idées ? doit bien y avoir un truc avec les NR NF ... ?!:!
 
 

Reply

Marsh Posté le 02-01-2006 à 23:44:58    

GhostDJ a écrit :

Bonjour,
 
j'aurais vraiment besoin d'aide :  
 
je souhaite faire un GREP de toto dans un fichier  
 
et afficher la ligne juste en dessous
 
exemple du fichier :  
 
blablab titi
tytytytytyt
blablab toto
tututututut
 
 
je souhaite afficher tutuututut
 
vous voyez le truc ?
 
j'essai de faire un truc du genre : grep toto mon_fic | awk -v NR==NR+1 '{print $0}'
mais ca semble pas correct :p


 
Bon, c'est pas possible avec grep.  grep extrait juste la ligne contenant ce que tu cherches et rien d'autre. Pour ça, t'as que "awk"
 
Bon, je tape vite fait un truc qui devrait marcher et t'afficher la ligne contenant "toto" ET la ligne du dessous
awk '{for (i=1; i < NF; i++) {if ($i == "toto" ) flag=2} if (flag != 0) {print $0; flag--}' fichier_a_traiter

Reply

Marsh Posté le 03-01-2006 à 00:14:05    

Avec sed :
 
S'il n'y a jamais deux lignes contenant toto qui se suivent :

Code :
  1. sed -ne '/toto/{n;p}' fichier_a_traiter


Sinon :

Code :
  1. sed -ne ':1;/toto/{n;p;b1}' fichier_a_traiter


Reply

Marsh Posté le 03-01-2006 à 16:54:07    

vos commandes ne passant pas :
j'ai trouvé ceci :  
sed -ne '/toto/,$p' < file.log
 
sauf que là ca m'affiche toutes les lignes qui suivent... il faudrait à présent réussir à choisir : la 1ere ligne qui suit, la 3e ..etc :bounce:

Reply

Marsh Posté le 03-01-2006 à 16:59:17    

grep + head + tail
 
[:dawa]


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 04-01-2006 à 22:59:23    

trop facile la vie avec awk  :pt1cable:  
 
cat fic | awk ' BEGIN {aff=0} {if (aff==1) { print $0 }; if ($0 ~ /toto/) { aff=1} else {aff=0}; } '  
 
Algo :  
j'initialise une variable drapeau (aff) à 0.  
Si aff==1  
 --> j'affiche la ligne
Si la ligne en cours correspond à l'expression régulière toto ( if ($0 ~ /toto/)  )
 --> aff = 1  
 --> sinon aff = 0
 
 
je pense que ca marchera sur sun aussi


---------------
Du tofu en Alsace : www.tofuhong.com
Reply

Marsh Posté le 05-01-2006 à 15:34:49    

fuck les erreurs de syntax j'en ai marre ...grrr
tu sais comment lancer en ligne par ligne, histoire de débuger mon truc ?

Reply

Marsh Posté le 05-01-2006 à 15:48:56    

GhostDJ a écrit :

vos commandes ne passant pas :
j'ai trouvé ceci :  
sed -ne '/toto/,$p' < file.log
 
sauf que là ca m'affiche toutes les lignes qui suivent... il faudrait à présent réussir à choisir : la 1ere ligne qui suit, la 3e ..etc :bounce:


et bien tu as presque reussi, il te suffit de faire un head  
 
sed -ne '/toto/,$p' | head 1 ou un truc du genre

Reply

Marsh Posté le 05-01-2006 à 15:48:56   

Reply

Marsh Posté le 05-01-2006 à 16:41:43    

GhostDJ a écrit :

fuck les erreurs de syntax j'en ai marre ...grrr
tu sais comment lancer en ligne par ligne, histoire de débuger mon truc ?


 
 
Je comprends pas ta question, lancer koi en ligne par ligne ?  
awk fonctionne en ligne par ligne pour faire du debugage tu ajout des print pour avoir plus d'info.
 
As tu tester ma commande qu'est ce qui marche pas ?
 
 
Sve@r > pas besoin de boucler sur les colonnes, le ~ permet de recherche selon une expression régulère donc sur la ligne entière avec $0
 
GhostDJ > ton idée de ton premier post ne peux pas fonctionner car tu n'envoi dans le awk que les lignes contenant toto.
 
weed > je pense que GhostDJ veux que ca fonctionne sur plusieurs de son fichier, pas une seul

Message cité 1 fois
Message édité par PierreC le 05-01-2006 à 16:43:33

---------------
Du tofu en Alsace : www.tofuhong.com
Reply

Marsh Posté le 06-01-2006 à 21:08:13    

PierreC a écrit :

Sve@r > pas besoin de boucler sur les colonnes, le ~ permet de recherche selon une expression régulère donc sur la ligne entière avec $0


 
Merci  :wahoo: Je suis pas assez bon en awk...
 
Petit plus que j'avais mis dans mon algo et qu'on peut intégrer au tien => j'ai mis mon drapeau à 2 et j'affiche toutes les lignes tant qu'il est supérieur à 0 => cela permet ainsi d'avoir juste la ligne sous "toto" (flag=2) ou les 2 lignes sous celle contenant "toto" (flag=3) ou les 3 lignes (flag=4)... ou les "n" lignes (flag=n + 1)  ;)


Message édité par Sve@r le 06-01-2006 à 21:12:31

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

Marsh Posté le 16-01-2006 à 16:59:23    

ok j'ai trouvé ca :  
 
#!/bin/sh
awk -F"\n" '
{
 for (i=1;i<NF;i++) {
print $i
     if ($i=="monitor" ) { flag=2; print $0; }
 }
 if (flag == 1) { print $0 }
 if (flag!=0) { flag-- }
}' $1
 
 
sauf que j'ai un pb avec un fichier au format XML ca merdoit ...
 
je m'en sors pas ..
je cherche une ligne comme ca :
                                <DESC>rjgfjlg lkjd monitor's port hj dlkjfg </DESC>
je vous dit pas la galere avec les >< et le '

Reply

Marsh Posté le 16-01-2006 à 23:07:30    

GhostDJ a écrit :

<DESC>rjgfjlg lkjd monitor's port hj dlkjfg </DESC>
je vous dit pas la galere avec les >< et le '


Ah ben oui, les caractères "<" et ">" étant spéciaux, tu dois les protéger soit entre guillemets simples, soit entre doubles, soit avec un backslash
 
Va récupérer mon cours http://fr.lang.free.fr/cours/Shell_v1.4.pdf. T'as un chapitre complet sur la neutralisation des métacaractères.
 
Sinon ptet que la libXML a été adapée en perl...


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

Marsh Posté le 17-01-2006 à 05:19:50    

awk '/toto/ { getline; print }'

Reply

Marsh Posté le 10-01-2008 à 18:07:15    

awk '/toto/ { print $NR+1 }' fichier

Reply

Sujets relatifs:

Leave a Replay

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