grep окружающие персонажи матча

8

Я ищу, чтобы найти и заменить в гигантском дампе базы данных, и он не делает то, что я думаю, должно произойти. Я хотел бы найти для моей целевой строки в файле, а затем увидеть окружающие 8 символов или около того (мне может потребоваться изменить это число, в зависимости от). Как я могу это сделать?

Причина, по которой я не могу взглянуть на это, заключается в том, что здесь сотни, если не тысячи матчей. Я хочу получить некоторое количество символов, окружающих строку, а затем направить ее uniqили что-то в этом роде, чтобы понять, почему мои операции поиска и замены ведут себя неожиданно.

Также на одной линии может быть несколько совпадений!

user394
источник
Это не текстовый файл?
энзотиб
Это так, но даже матчи - это слишком большой файл для глазного яблока.
user394

Ответы:

12

Грубый способ использования grepбудет что-то вроде

grep -o "....yourtext...." /path/to/the/dump.sql

Количество точек соответствует количеству символов до / после выделенного текста. -oОпция позволяет grepвыводить только матчи, а не целые линии.

Чтобы использовать uniqв выводе, помните, что вы должны сначала отсортировать вывод. Как правило, вы бы сделали

grep . . . | sort | uniq

Если вас интересует количество просмотров для каждого матча, вы можете получить хороший результат, используя

grep . . . | sort | uniq -c | sort -n
rozcietrzewiacz
источник
Сырая? Совершенно изощренный!
user394
1
Вы могли бы расширить это немного с помощью оператора повтора grep -o '.\{8\}yourtext.\{8\}'. Это немного менее головокружительно, чем считать 8 точек.
Калеб
:) Под грубой я имею в виду, что вы не играете с такими вещами, как подсчет совпадающих символов (использование диапазонов) или сужение наборов символов.
rozcietrzewiacz
@Caleb и user394: это именно то, что я намеревался не предлагать (и поэтому назвал мой метод «сырым»). Кроме того, не нужно запоминать конструкцию оператора повтора - даже быстрее набрать «.....», чем «. \ {6 \}».
rozcietrzewiacz
7

Начиная с ответа @rozcietrzewiacz, я могу расширить до

pattern="string"
num=8
grep -on ".\{0,$num\}$pattern.\{0,$num\}" input-file
enzotib
источник
1
«Сырая» последовательность точек выглядит все лучше и лучше все время :)
Калеб
1
@Caleb: обычно «грубый» ответ - хорошее начало, но иногда хочется немного углубиться в это.
энзотиб
1
Метод точечной последовательности не найдет левые или правые выровненные целевые шаблоны; этот метод будет. (+1)
Peter.O
2
PS .. Я только что заметил, что он не будет перехватывать несколько экземпляров шаблона в одной строке (как упоминалось в OP), когда область конечного текста exta первого шаблона перекрывает область начального дополнительного текста. следующего паттерна
Peter.O
@fred: да, -oдает только первое совпадение, когда два совпадения перекрываются:echo 'aaabbbccc' | grep -o 'bb
enzotib