2017-01-16 4 views
2

У меня есть файл журнала с большим количеством собранных журналов, я уже сделал команду grep с регулярным выражением, которое выводит количество строк, которые соответствуют ему. Это grep команда, которую я буду использовать для вывода совпавших строк:Вырезать скрипт Bash в определенных диапазонах

grep -n -E 'START_REGEX|END_REGEX' Example.log | cut -d ':' -f 1 > ranges.txt 

Регулярного выражение условно может соответствовать началу конкретного журнала или его конца, таким образом, выход что-то вроде:

12 
45 
128 
136 
... 

Идея состоит в том, чтобы использовать это как источник диапазонов, чтобы сделать конкретный разрез файла журнала с первого номера на второй и сохранить его в другом файле.
Диапазоны производятся парами выходных сигналов, в соответствии с примером первый диапазон - 12,45, а второй 128,136.
Я ожидаю увидеть в конечном файле весь текст из строки 12 to 45, а затем от 128 to 136. Проблема, с которой я столкнулся, заключается в том, что команда sed, похоже, работает только с одним диапазоном.

sed -E -iTMP "$START_RANGE,$END_RANGE! d;$END_RANGEq" $FILE_NAME 

Есть ли способ (возможно, с awk), чтобы сделать это только в одном «цикл»? Ограничения: я могу использовать только поддерживаемую команду bash.

+4

Просьба уточнить, что представляет собой диапазон от источника, а также дать пример ввода и вывода. – 123

+0

Что вы на самом деле пытались сделать в первую очередь, прежде чем думать о сложном grep? – kabanus

+0

Спасибо, я обновил ответ. – Andrea

ответ

2

С sed вы можете сделать несколько диапазонов строк так:

sed -n '12,45p;128,136p' 

Это было бы выходные линии 12-45, затем 128-136.

+2

Я не думаю, что они хотят использовать жестко заданные значения – 123

+0

@ 123, переменные должны работать нормально вместо них. –

+1

Да работает! Когда я пытался использовать несколько диапазонов, мне не хватало 'p'. Спасибо! – Andrea

2

Вы можете использовать awk заявление тоже

awk '(NR>=12 && NR<=45) || (NR>=128 && NR<=136)' file 

где NR специальная переменная в Awk сохраняющими следы номер строки, как он обрабатывает файл.

Пример,

seq 1 10 > file 
cat file 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
awk '(NR>=1 && NR<=3) || (NR>=8 && NR<=10)' file 
1 
2 
3 
8 
9 
10 

Вы также можете избежать, жесткое кодирование номера строк с помощью переменной опции -v,

awk -v start1=1 -v end1=3 -v start2=8 -v end2=10 '(NR>=start1 && NR<=end1) || (NR>=start2 && NR<=end2)' file 
1 
2 
3 
8 
9 
10