grep tail и голова неправильный результат - PullRequest
0 голосов
/ 22 мая 2019

Я хочу показать 3 первые строки и 2 последние строки, которые содержат слово. Я попробовал команду grep, но она не показывает то, что я хочу.

grep -w it /usr/include/stdio.h | head -3 | tail -2

Отображаются только 2-я и 3-я строки, в которых содержится «оно».

Ответы [ 3 ]

1 голос
/ 22 мая 2019

Проблема здесь в том, что tail никогда не получает вывод grep, а только первые 3 строки файла.Чтобы сделать это надежно, вам нужно либо grep дважды, один раз с head и один раз с tail, либо мультиплексировать поток, например:

grep -w it /usr/include/stdio.h |
tee >(head -n3 > head-of-file) >(tail -n2 > tail-of-file) > /dev/null
cat head-of-file tail-of-file

Вывод здесь:

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   The GNU C Library is distributed in the hope that it will be useful,
   or due to the implementation it is a cancellation point and
/* Try to acquire ownership of STREAM but do not block if it is not
0 голосов
/ 22 мая 2019

вы должны попробовать это

grep -A 2 -B 3 "it" /usr/include/stdio.h

-A = После контекста из 2 строк для соответствующего слова "it"

-B = После контекста из 3 строк для соответствующего слова "это "

, вы также можете добавить -W, если вам действительно нужно регулярное выражение.

ожидаемый результат:

строка 1

строка 2

строка, в которой он содержится

строка 4

строка 5

строка 6

0 голосов
/ 22 мая 2019

Вы можете просто добавить результаты головы и хвоста:

{ head -3 ; tail -2 ;} < /usr/include/stdio.h
...