Вопрос: grep файл, но показывать несколько окружающих линий?


я бы хотел grepдля строки, но также показывают предыдущие пять строк и следующие пять строк, а также совпадающую строку. Как я смогу это сделать?


2701


источник


Ответы:


Для BSD или GNU grepвы можете использовать -B numустановить, сколько строк перед матчем и -A numдля количества строк после матча.

grep -B 3 -A 2 foo README.txt

Если вы хотите иметь такое же количество строк до и после использования -C num,

grep -C 3 foo README.txt

Это покажет 3 строки до и 3 строки после.


3586



-Aа также -Bбудет работать, как -C n(для nлинии контекста) или просто -n(для nлинии контекста).


510



извед работает с аналогичными аргументами как grep, и принимает -C, Но обычно лучше искать код.


66



grep astring myfile -A 5 -B 5

Это будет grep «файл» для «string» и покажет 5 строк до и после каждого совпадения


32



Я обычно использую

grep searchstring file -C n # n for number of lines of context up and down

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

man grep

Многие инструменты GNU также имеют информационная страница который может содержать более полезную информацию в дополнение к странице руководства.

info grep

16



Найдите «17655» в «/some/file.txt», показывая 10 строк контекста до и после (используя Awk), вывод должен содержать номер строки, за которым следует двоеточие. Используйте это в Solaris, когда «grep» не поддерживает опции «- [ACB]».

awk '

/17655/ {
        for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
                print before[i]
        }
        print (NR ":" ($0))
        a = 10
}

a-- > 0 {
        print (NR ":" ($0))
}

{
        before[b] = (NR ":" ($0))
        b = (b + 1) % 10
}' /some/file.txt;

9



Use grep

$ grep --help | grep -i context
Context control:
  -B, --before-context=NUM  print NUM lines of leading context
  -A, --after-context=NUM   print NUM lines of trailing context
  -C, --context=NUM         print NUM lines of output context
  -NUM                      same as --context=NUM

4



ripgrep

If you care about the performance, use ripgrep which has similar syntax to grep, e.g.

rg -C5 "pattern" .

-C, --context NUM - Show NUM lines before and after each match.

There are also parameters such as -A/--after-context and -B/--before-context.

The tool is built on top of Rust's regex engine which makes it very efficient on the large data.


2



Here is the @Ygor solution in awk

awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile

Note: Replace a and b variables with number of lines before and after.

It's especially useful for system which doesn't support grep's -A, -B and -C parameters.


0