Я хотів би 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
Це призведе до "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 --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- Показати NUM рядків до та після кожного матчу.
Також є такі параметри, як -A/ --after-contextі -B/ --before-context.
Інструмент побудований на основі регекс-двигуна Руста, що робить його дуже ефективним у великих даних.
Ось рішення @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параметри.
Якщо ви часто шукаєте код, AG пошук срібла набагато ефективніший (тобто швидший) ніж grep.
Ви показуєте рядки контексту за допомогою параметра -C.
Наприклад:
ag -C 3 "foo" myFile
line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7