Есть ли у pcregrep (или pcre2grep )эквивалент параметра grep --max -count?

Да, если ваша переменная не оптимизирована.

Например, используя lsс символами отладки:

gdb ls
>>> break main
>>> run
>>> print argv
$1 = (char **) 0x7fffffffdd78

В данном случае argvявляется указателем. Если вам нужен адрес переменной-указателя, отличной от -, или адрес указателя, используйте &, как в C; gdbдаст вам адрес, как указано выше, или сообщит вам, если переменная не сохранена в памяти:

>>> printf &argc
Address requested for identifier "argc" which is in register $rdi

В x86 содержимое SPподскажет вам, где находится стек:

>>> i r sp
sp             0x7fffffffdc98      0x7fffffffdc98
-2
16.10.2021, 15:05
1 ответ

Поскольку вы используете Debian 9 (Stretch ), у вас есть версия pcre2-utils, которая включает pcre2grep10.22. В этой версии нет опции -mили --max-countдля выхода после определенного количества матчей. С учетом сказанного, то, что вы пытаетесь сделать, распечатать до строки, просто невозможно с версией, которая у вас есть.

Версия, поставляемая с Debian 11 (Bullseye ), 10.34, не имеет этой опции. Вы можете использовать его в файле, который вам нужен для достижения ожидаемого результата, со следующим:

pcre2grep -B2 -m1 XXX file

Вы также можете сделать это с помощью обычных grep, так как нет необходимости использовать Perl -совместимые регулярные выражения для вашего случая:

grep -B2 -m1 XXX file

Параметр -nне нужен, так как он просто печатает номер строки, которого нет в ожидаемом выводе, а параметр -Mконфликтует с параметром -m, поскольку первый говорит, что он соответствует нескольким строкам.

Вывод вышеуказанных команд:

aaa
bbb
XXX

Это печатает до первого совпадения строки XXX, а также двух строк до него; однако я бы не рекомендовал этого, потому что вам нужно точно знать, сколько строк появляется от начала строки до строки. Это может не быть проблемой для вашего конкретного файла, но было бы, если бы файл содержал тысячи или миллионы строк.

По сути, вы пытаетесь напечатать все, начиная с начала файла и заканчивая определенной строкой включительно. Ни grep, ни любые его производные, такие как pcre2grep, не предназначены для этого и не имеют возможности самостоятельно получить этот результат надежным образом. Именно по этой причине лучше использовать инструмент, который действительно предназначен для достижения этой цели, такой как sedили awk, о которых я упоминал ранее. Они гораздо надежнее и проще в использовании, чтобы получить то, что вы хотите, и не требуют каких-либо корректировок или необходимости точно знать, сколько строк предшествует тому месту, где вы хотите, чтобы вывод остановился. Возможно, вы начали это с намерением использовать pcre2grep, но важно понимать, что есть варианты получше, и использовать один из них.

1
17.10.2021, 13:04

Теги

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