Да, если ваша переменная не оптимизирована.
Например, используя 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
Поскольку вы используете Debian 9 (Stretch ), у вас есть версия pcre2-utils
, которая включает pcre2grep
10.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
, но важно понимать, что есть варианты получше, и использовать один из них.