Я часто использую grep, чтобы найти файлы с определенной записью, подобной этой:
grep -R 'MyClassName'
Хорошо, что он возвращает файлы, их содержимое и помечает найденную строку красным цветом. Плохо то, что у меня также есть огромные файлы, где весь текст написан одной большой строкой. Теперь grep выводит слишком много при поиске текста в этих больших файлах. Есть ли способ ограничить вывод, например, 5 словами слева и справа? Или, может быть, ограничить вывод до 30 букв влево и вправо?
command-line
text-processing
grep
Сократ
источник
источник
cut
cut
, так как он разделяется только по разделителю или количеству символов. Хотя, когда я нахожу строку сMyClassName
ней, она может находиться где угодно в строке и не всегда в одной и той же позиции. Кроме того, могут быть различные символы спереди и сзади, что исключает возможность разделения по разделителю.MyClassName
, я хочу получить в результате имя файла и символы x слева и справа. x - это любое число, которое я предоставляю, например, 30. Остальное содержимое файла должно игнорироваться. Это делается для того, чтобы получить контекст для соответствующих файлов и ограничить перегрузку.cut
если есть три файла со следующим вводом:oiadfaosuoianavMyClassNameionaernaldfajd
и/(/&%%§%/(§(/MyClassName&((/$/$/(§/$&
иpublic class MyClassName { public static void main(String[] args) { } }
?Ответы:
grep
сам по себе имеет только параметры для контекста, основанного на строках. В этом сообщении SU предлагается альтернатива :В качестве другой альтернативы я бы предложил
fold
ввести текст, а затем добавить его, например:-s
Опция сделаетfold
толчок слова на следующую строку вместо разрыва между ними.Или используйте другой способ разделения ввода по строкам в зависимости от структуры ввода. (Например, в сообщении SU речь шла о JSON, поэтому использование
jq
etc для красивой печати иgrep
... или просто использованиеjq
самой фильтрации ... было бы лучше, чем любая из двух альтернатив, приведенных выше.)Этот метод GNU awk может быть быстрее:
-v RS=...
) и количеству символов в контексте (-v n=...
)FNR > 1
) - это запись, в которой awk находит соответствие шаблону.n
завершающие символы из предыдущей строки (p
) иn
начальные символы из текущей строки (substr($0, 0, n)
) вместе с соответствующим текстом для предыдущей строки (которая естьprt
)p
иprt
после печати, поэтому значение, которое мы устанавливаем, используется следующей строкойRT
это GNUism, поэтому это специфично для GNU awk.Для рекурсивного поиска, возможно:
источник
fold
Метод может быть использован только если вы уверены , что искомая строка не появляется на границе, в противном случае было бы получить скрытgrep
.gawk
. К сожалению, предложенная командаfind
выводит случайные вещи без имен файлов, когда выполняется в моей системе. Кроме того, я недостаточно хорошо знаю,awk
чтобы правильно проанализировать команду. В настоящее время Regex в сочетании сgrep
решением проблемы может быть не быстрым, но надежным. Еще раз большое спасибо.RT
префиксы и т. Д. Должны были использоваться.Использование только сопоставления в сочетании с некоторыми другими параметрами (см. Ниже) может быть очень близко к тому, что вы ищете, без затрат на обработку регулярных выражений, упомянутых в другом ответе.
источник
MyClassName
. Следовательно, контекст отсутствует.grep -RnHo "MyClassName"
иgrep -Rno "MyClassName"
имеют одинаковый выход.-o
Флаг может быть интересен , если регулярное выражение было некоторая переменная часть. Для фиксированной строки бесполезно печатать ее каждый раз. ОП скорее всего интересует ближний контекст.-B 1
) или после (-A 1
). Извините, что я не мог помочь.