grep - байтовое смещение не дает мне, байты смещают?

Все следующие методы печатают то, что в [ и ] но только если это - последнее поле:

ps aux | awk '$NF~/\[/{print $NF}'

Преимущество состоит в том, что это будет только соответствовать a [ в последнем поле. Эквивалентное использование grep

ps aux | grep -o '\[.*\]$'

Можно также сделать это с Perl

ps aux | perl -lne '/(\[.+?\])$/ && print $1'

И sed:

ps aux | sed -n 's/.*\(\[.*\]\)$/\1/p'
2
03.04.2014, 15:16
2 ответа

grep по умолчанию возвращает только совпадений для двоичных файлов.

Вам нужно будет указать grep , чтобы двоичные файлы обрабатывались как текст.

grep -a -b 'EXTH' Agent_of_Change.mobi

Однако grep предупреждает вас о возможных последствиях:

          option.  If TYPE is text, grep processes a binary file as if  it
          were  text;  this is equivalent to the -a option.  Warning: grep
          --binary-files=text might output binary garbage, which can  have
          nasty  side  effects  if  the  output  is  a terminal and if the
          terminal driver interprets some of it as commands.
3
27.01.2020, 21:54

Добавьте -a для принудительной печати совпадений, даже если они кажутся непечатаемыми.

Добавьте -o и он будет печатать только "EXTH" вместо строки. Это также изменит смещение байтов - будет выведено смещение "EXTH" вместо смещения начала строки, содержащей "EXTH". Если файл на самом деле не состоит из строк, это будет улучшением!

Или используйте perl -n0777e 'print pos()-length($&),"\n" while /EXTH/g' для замены зависимости от GNU grep на зависимость от чего-то более универсального... (Предупреждение: засовывает весь файл в память, может быть неприятно для больших файлов)

3
27.01.2020, 21:54

Теги

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