search - файле - поиск в нескольких файлах linux




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

ripgrep

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

rg -C5 "pattern" .

-C , --context NUM - Показывать NUM строк до и после каждого совпадения.

Существуют также такие параметры, как -A / --after-context и -B / --before-context .

Инструмент построен поверх механизма регулярного выражения Rust, что делает его очень efficient для больших данных.

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


Вот решение @Ygor в 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

Примечание: Замените переменные a и b числом строк до и после.

Это особенно полезно для системы, которая не поддерживает параметры gre- -A , -B и -C .


Использовать 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

Найдите «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;

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


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







command-line-interface