Я хочу показать все строки перед совпадением, а не только 10, или 7, или 14, например, как описано в Как мне выбрать строки до / после grep приводит к bash? .
Как мне это сделать? Не имеет значения, включена ли соответствующая строка или нет.
Например, вместо:
... | grep -B 10 -- "foo"
Я хочу:
... | grep -B -- "foo"
Но этот последний код не работает.
Включая совпадение,
файл sed '/ foo / q'
Лучше q uit sed
, как только будет найдено совпадение, иначе sed
будет продолжать читать файл и тратить ваше время, что приведет к быть значительным для больших файлов.
Исключая совпадение,
sed -n '/ foo / q; p' file
Флаг -n
означает, что будут напечатаны только строки, соответствующие команде p
. Поскольку строка foo
запускает действие q
uit, она не достигает p
и, таким образом, не печатается.
sed
] принадлежит GNU, его можно упростить до файла sed '/ foo / Q'
Показать ВСЕ строки перед совпадением
Вы можете использовать достаточно большое число для параметра -B
команды grep. Например, если вы знаете, что размер ввода не превышает 999
, вы можете использовать его с параметром -B
:
... | grep -B 999 -- "foo"
Версия FreeBSD (включая MacOS) действительно имеет такую функцию.
Хорошо -B -1
работает, он показывает все строки перед совпадением из начало файла.
... | grep -B -1 -- "foo"
То же самое для -A -1
, показывает все строки после совпадения до конца файла.
... | grep -A -1 -- "foo"
Может быть полезно для некоторых, не работает с реализацией GNU, включенной в Ubuntu.
Чтобы распечатать все строки перед совпадением,
perl -pe 'exit if /foo/' file
awk '/foo/{exit} 1' file
Текущие решения, за исключением 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 Вот решение с 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
С GNU sed. Вывести все строки, от первой до строки с требуемой строкой.
sed '0,/foo/!d' file