Используйте grep для извлечения текста из файла на основе регулярного выражения

Я использовал технику, описанную другими на этой странице (SSH в initramfs с параметром ядра IPдля настройки сети )уже несколько лет, чтобы удаленно разблокировать безголовые серверы Ubuntu Linux (12.02, 14.04, 16.04 и 18.04 ).

Я даже зашел так далеко, что разработал программу на Python(разблокировать -удаленную -систему ), которая делает фактическую разблокировку за меня, потому что процесс выполнения этого вручную казался немного хрупким, и я начал бояться перезагрузки своих серверов, поэтому в духе «если это больно, стоит автоматизировать» я закодировал свои знания в Python (, и это действительно значительно упростило регулярные перезагрузки для установки обновлений безопасности ).

С тех пор я решил также поделиться своими личными заметками о шифровании удаленного корневого диска со всем миром. Связанная страница содержит довольно много подробностей о процедуре (, а также некоторые подсказки, которые здесь не упомянуты ), и я намерен поддерживать ее в актуальном состоянии.

2
09.04.2020, 13:02
2 ответа

grepпо умолчанию использует Posix Basic Regex (BRE), который не поддерживает вашу нотацию.

Используйте grep -Eдля использования расширенного регулярного выражения Posix(EREgrep -Pдля использования Perl-совместимого регулярного выражения (PCRE), если оно доступно.

Ваша нотация работает сgrep -P:

grep -P '^\s+version:\s+(\d\.\d\.\d)' file.txt

Работает сBRE:

grep '^ \+version: \+\([0-9]\.[0-9]\.[0-9]\)' file.txt

Выход:

  version: 1.2.3

Обратите внимание, что группа захвата здесь не нужна, так как grepничего с ней не делает.


Если вам нужен только номер версии, используйте\Kи -oопцию:

grep -Po '^\s+version:\s+\K\d\.\d\.\d' file.txt

Выход:

1.2.3

С BREэто невозможно, вам нужно связать две grepкоманды:

grep 'version: ' file.txt | grep -o '[0-9]\.[0-9]\.[0-9]'

или используйтеsed(кредиты @Kusalananda):

sed -n 's/.*version: //p' file.txt
10
28.04.2021, 23:18

Согласно комментарию pLumo и Как использовать grep для получения чего-либо сразу после имени рабочей командой может быть

 grep -oP "(?<=version: )(\d\.\d\.\d)" file.txt
3
28.04.2021, 23:18

Теги

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