2010-08-16 5 views
1

J'ai une collection de fichiers dans un répertoire que je voudrais rechercher une expression régulière particulière (=([14-9]|[23][0-9]), en l'occurrence). Mais je me soucie seulement quand ce modèle tombe sur la deuxième, sixième, dixième, ..., 4n + 2-ème ligne.Grepping seulement certaines lignes de fichiers

Existe-t-il un bon moyen de le faire?

Répondre

1

Vous devez passer par awk premier à se débarrasser des lignes indésirables (et éventuellement mis sur les numéros de ligne afin que vous puissiez encore dire quelles sont les lignes réelles sont):

pax> echo 'L1 
...> L2 
...> L3 
...> L4 
...> L5 
...> L6 
...> L7 
...> L8 
...> L9 
...> L10 
...> L11 
...> L12' | awk '{if ((FNR % 4)==2) {print FNR":"$0}}' 
2:L2 
6:L6 
10:L10 

(utilisez simplement '{if ((FNR % 4)==2) {print}}' si vous ne vous souciez pas des numéros de ligne). Donc, quelque chose comme:

awk '{if ((FNR % 4)==2) {print FNR":"$0}}' inputFile | grep '(=([14-9]|[23][0-9])' 

devrait faire l'affaire.

+0

Merci! Une légère modification, awk '{if ((FNR% 4) == 2) {print FNR ":" $ 0}}' * | egrep '= ([14-9] | [23] [0-9])' a bien fonctionné. – Charles

1

essayez de le faire avec awk. Someting comme

BEGIN  {i=0; n=0; } 

/yourregegex/ { 
       if(i==n) { print $0; n= 4*i+2;} 
       } 

       { 
       i++; 
       } 
2

modification de la réponse sans utiliser grep supplémentaire,

awk '/(=([14-9]|[23][0-9])/ && FNR % 4==2{print FNR":"$0}}' inputFile 
Questions connexes