Ответов (14)14
Для 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 строки после.
Я обычно использую
grep searchstring file -C n # n for number of lines of context up and down
Многие инструменты, такие как grep, также имеют действительно отличные файлы man. Я часто обращаюсь к странице руководства grep, потому что с ней можно многое сделать.
man grep
Многие инструменты GNU также имеют информационную страницу, которая может содержать более полезную информацию в дополнение к странице руководства.
info grep
ack работает с аргументами, аналогичными grep, и принимает -C
. Но обычно это лучше для поиска по коду.
Найдите «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;
Вот решение @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
переменные с числом строк до и после.
Это особенно полезно для системы , которая не поддерживает Grep - х -A
, -B
и -C
параметры.
ripgrep
Если вам важна производительность, используйте ripgrep
синтаксис, аналогичный grep
, например,
rg -C5 "pattern" .
-C
,--context NUM
- Показывать ЧИСЛО строк до и после каждого совпадения.
Также есть такие параметры, как -A
/ --after-context
и -B
/ --before-context
.
Инструмент построен на основе движка регулярных выражений Rust, что делает его очень эффективным для больших данных.
Если вы ищите код часто, серебряный поисковик AG намного эффективнее (т. Е. Быстрее), чем grep.
Вы показываете контекстные строки, используя параметр -C.
Например:
ag -C 3 "foo" myFile
line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7