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