2010-08-16 5 views
1

У меня есть коллекция файлов в каталоге, в котором я хотел бы найти определенное регулярное выражение (=([14-9]|[23][0-9]), как это бывает). Но мне все равно, когда эта картина падает на вторую, шестую, десятую, ..., 4n + 2-ю строку.Grepping только определенные строки файлов

Есть ли хороший способ сделать это?

ответ

1

Вы должны пройти через awk первый, чтобы избавиться от нежелательных линий (и, возможно, поставить на номера строк, так что вы можете сказать, что реальные линии):

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 

(просто используйте '{if ((FNR % 4)==2) {print}}', если вам не нужны номера строк). Так что-то вроде:

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

должен сделать трюк.

+0

Спасибо! Небольшая модификация, awk '{if ((FNR% 4) == 2) {print FNR ":" $ 0}}' * | egrep '= ([14-9] | [23] [0-9]) «отлично работал. – Charles

1

попробуйте сделать это с помощью awk. Коснуться как

BEGIN  {i=0; n=0; } 

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

       { 
       i++; 
       } 
2

модификация ответа без использования дополнительных Grep,

awk '/(=([14-9]|[23][0-9])/ && FNR % 4==2{print FNR":"$0}}' inputFile 
Смежные вопросы