Символы Grep до и после матча?

Используя это:

grep -A1 -B1 "test_pattern" file

будет выводить одну строку до и после совпадающего шаблона в файле. Есть ли способ отображать не строки, а определенное количество символов?

Линии в моем файле довольно большие, поэтому мне не интересно печатать всю строку, а только наблюдать за соответствием в контексте. Любые предложения о том, как это сделать?

Ответ 1

3 символа до и 4 символа после

$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}'
23_string_and

Ответ 2

grep -E -o ".{0,5}test_pattern.{0,5}" test.txt 

Это будет соответствовать до 5 символов до и после вашего шаблона. Переключатель -o указывает grep показывать только совпадение, а -E - использовать расширенное регулярное выражение. Не забудьте поставить кавычки вокруг вашего выражения, иначе это может интерпретироваться оболочкой.

Ответ 3

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

awk '/test_pattern/ {
    match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20);
}' file

Ответ 4

Вы имеете в виду, например:

grep -o '.\{0,20\}test_pattern.\{0,20\}' file

?

Это будет печатать до двадцати символов по обе стороны от test_pattern. Обозначение \{0,20\} похоже на *, но указывает от нуля до двадцати повторений вместо нуля или более. -o говорит, что отображает только совпадение, а не всю строку.

Ответ 5

С помощью gawk вы можете использовать функцию соответствия:

    x="hey there how are you"
    echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}'
    ere   are

Если вы в порядке с perl, более гибкое решение: следующее будет печатать три символа перед шаблоном, за которым следует фактический шаблон, а затем 5 символов после шаблона.

echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/'
ey there how

Это также может быть применено к словам вместо простых символов. После этого будет напечатано одно слово перед фактической совпадающей строкой.

echo hey there how are you |perl -lne 'print $1 if /(\w+) there/'
hey

Следующее выведет одно слово после шаблона:

echo hey there how are you |perl -lne 'print $2 if /(\w+) there (\w+)/'
how

После этого будет напечатано одно слово перед шаблоном, затем фактическое слово, а затем одно слово после шаблона:

echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)( there )(\w+)/'
hey there how

Ответ 6

Вы можете использовать regexp grep для поиска + второй grep для выделения

echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' | grep string

23_string_and

enter image description here