2012-06-19 4 views
5

Можно ли использовать grep для соответствия только строкам с числами в заданном диапазоне? Например, я хочу перечислить все строки с номерами в диапазоне [1024, 2048] журнала, содержащего слово «ошибка».grep соответствует только линиям в указанном диапазоне

Я хотел бы сохранить функциональность «-n», то есть иметь номер согласованной строки в файле.

ответ

5
sed -n '1024,2048{/error/{=;p}}' | paste - - 

Здесь /error/ является образцом для матч и = печатает номер строки.

+0

Я принимаю ваш ответ, потому что он также печатает исходные номера строк. Я не совсем понимаю бит с {/ error/{=; p}}, можете ли вы объяснить это, пожалуйста? –

+0

/error/- шаблон, который будет соответствовать в пределах диапазона заданного числа. –

+0

Ничего себе! Теперь я узнаю новый трюк! Это мощно! – Viet

7

Использование СЭД первой:

СЕПГ -ne '1024,2048p' | Grep ...

-n говорит не печатать строки, 'х, у, р' говорит печать строки х включительно (переопределяет -n)

+0

Поэтому я считаю, решение принца Джона Уэсли лучше является то, что он также печатает оригинальные номера строк, в то время как здесь у меня будет свой номер в указанном диапазоне. Все еще +1. –

3

Awk является хорошим инструментом для работы:

$ awk 'NR>=1024 && NR<=2048 && /error/ {print NR,$0}' file 

В awk переменная NR содержит номер текущей строки и $0 содержит саму строку.

Преимущества использования awk состоят в том, что вы можете легко изменить вывод для отображения, однако вы хотите его использовать. Например, чтобы отделить номер строки из строки с двоеточием, за которым следует TAB:

$ awk 'NR>=1024 && NR<=2048 && /error/ {print NR,$0}' OFS=':\t' file 
Смежные вопросы