Питання grep файл, але показати кілька навколишніх ліній?


Я хотів би це зробити grep для рядка, але також показують попередні п'ять рядків і наступні п'ять рядків, а також відповідну лінію. Як я зможу це зробити?


2756
2017-08-12 17:55


походження


Я зберігаю копію Perl-скрипт Брендана Грега навколо для цієї мети. Працює добре. - Ethan Post
Для рішення, що працює на Solaris, перевірте це посилання. - jahroy
man grep | grep -C 1 context :) - StvnW
man grep | grep -C 1 "\-C" ;) - Anders B


Відповіді:


Для 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 рядки після.


3679
2017-08-12 17:57



Це добре, але, на жаль, Solaris grep це не підтримує. Див. Цю посилання для solaris: unix.com/solaris/33533-grep-display-few-lines-before-after.html - рüффп
Гаразд, але що, якщо хочете показати все лінії виходу після матчу? grep-A0 і grep-A-1 не вирізати його ... - g33kz0r
з якоїсь причини не працює для мене, хоча й згадується на моїх сторінках. - Hayri Uğur Koltuk
Якщо ви HP-UX env, жоден з версій grep не буде працювати, як у Solaris. Вдалося використати посилання Solaris, але замінити nawk за допомогою awk в цьому посиланні. - zkarthik
-n для рядків, але для деяких версій grep -n # буде показано # навколишніх рядків (наприклад, -c) з номерами рядків. Це корисне ярлик, це моя ідея, коли мені потрібен контекст. - Anthony DiSanti


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


520
2017-08-12 17:59



+1 - -5 швидше вводити, ніж -A 5 -B 5 - mouche


акк працює з подібними аргументами як grep і приймає -C. Але зазвичай це краще для пошуку через код.


66
2017-09-07 11:13



ack також підтримує -A -B. - Shuo
Ack краще, ніж grep, багатьма способами. Це швидше за допомогою простішого синтаксису. - chim


grep astring myfile -A 5 -B 5

Це допоможе grep "myfile" для "astring", і покаже 5 рядків до і після кожного матчу


32
2017-08-12 17:58



"grep astring myfile-5" буде робити те ж саме - Syed Siraj Uddin


Я зазвичай використовую

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

Багато інструментів, таких як grep, також мають надзвичайно чудові файли. Я вважаю, що я маю на увазі сторінка людини ГРП багато, тому що є так багато, що ви можете зробити з цим.

man grep

Багато інструментів GNU також мають інформаційна сторінка що може мати додаткову корисну інформацію на додачу до сторінки користувача.

info grep

16
2017-08-12 18:42





Знайдіть "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;

8
2017-10-08 00:21





Використовуйте 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

5
2018-01-12 11:25



Ви не читали прийняту відповідь? Ви просто повторюєте те, що вже було сказано на питання майже 10 років ... - Yokai
О, я пробачаю Йокай. Але я не читаю нічого про посилення розділу допомоги grep, щоб отримати відповідь. - Chiel ten Brinke


ripgrep

Якщо ви дбаєте про продуктивність, скористайтеся ripgrep який має аналогічний синтаксис до grep, наприклад

rg -C5 "pattern" .

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

Є також такі параметри, як -A/--after-context і -B/--before-context.

Інструмент побудований на вершині Регукс двигун іржі що робить це дуже ефективний за великими даними.


2
2018-04-11 10:28





Ось це @ Рішення ігор в 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's -A, -B і -C параметри


0
2018-04-11 10:24