Показать все строки перед совпадением

Я хочу показать все строки перед совпадением, а не только 10, или 7, или 14, например, как описано в Как мне выбрать строки до / после grep приводит к bash? .

Как мне это сделать? Не имеет значения, включена ли соответствующая строка или нет.

Например, вместо:

... | grep -B 10 -- "foo"

Я хочу:

... | grep -B -- "foo"

Но этот последний код не работает.

11
задан 22 October 2020 в 23:15

7 ответов

  • Включая совпадение,

     файл sed '/ foo / q'
     

    Лучше q uit sed , как только будет найдено совпадение, иначе sed будет продолжать читать файл и тратить ваше время, что приведет к быть значительным для больших файлов.

  • Исключая совпадение,

     sed -n '/ foo / q; p' file
     

    Флаг -n означает, что будут напечатаны только строки, соответствующие команде p . Поскольку строка foo запускает действие q uit, она не достигает p и, таким образом, не печатается.

    • Если ваш sed ] принадлежит GNU, его можно упростить до файла
     sed '/ foo / Q'
     
12
ответ дан 4 January 2021 в 08:19

Показать ВСЕ строки перед совпадением

Вы можете использовать достаточно большое число для параметра -B команды grep. Например, если вы знаете, что размер ввода не превышает 999 , вы можете использовать его с параметром -B :

... | grep -B 999 -- "foo"
1
ответ дан 4 January 2021 в 08:19

Версия FreeBSD (включая MacOS) действительно имеет такую ​​функцию.

Хорошо -B -1 работает, он показывает все строки перед совпадением из начало файла.

... | grep -B -1 -- "foo"

То же самое для -A -1 , показывает все строки после совпадения до конца файла.

... | grep -A -1 -- "foo"

Может быть полезно для некоторых, не работает с реализацией GNU, включенной в Ubuntu.

2
ответ дан 4 January 2021 в 08:19

Чтобы распечатать все строки перед совпадением,

perl -pe 'exit if /foo/' file
awk '/foo/{exit} 1' file
2
ответ дан 4 January 2021 в 08:19

Текущие решения, за исключением schrodigerscatcuriosity, печатают содержимое файла даже при отсутствии совпадений. schrodigerscatcuriosity включает использование tac и поэтому требует чтения всего ввода перед поиском совпадений.

Вот еще один способ сделать это с помощью только sed и печати только при совпадении:

sed -n '1h;1!H;/foo/{g;p;q}'
  • ] 1h - скопировать пространство шаблонов для хранения пробела в первой строке
  • 1! H - добавить пространство шаблонов для хранения пробелов, когда не в первой строке
  • / foo / {.. .} - при сопоставлении / foo / ,
    • g - скопировать удерживаемое пространство в пространство шаблона
    • p -print pattern space
    • q - quit
3
ответ дан 4 January 2021 в 08:19

Вот решение с sed , учитывая содержимое файла file.txt:

bar
baz
moo
foo
loo
zoo

команда, включая шаблон

tac file.txt | sed -n '/foo/,$p' | tac

вывод

bar
baz
moo
foo

исключая шаблон

tac file.txt | sed -n -e '/foo/,$p' | tac | sed -n '/foo/!p'

bar
baz
moo
5
ответ дан 4 January 2021 в 08:19

С GNU sed. Вывести все строки, от первой до строки с требуемой строкой.

sed '0,/foo/!d' file
6
ответ дан 4 January 2021 в 08:19

Другие вопросы по тегам:

Похожие вопросы: