У меня есть строка
00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256
и хочу извлечь слово, qa
которое следует -Dspring.profiles.active
.
У меня есть строка сохранить в файл text.txt просто для демонстрации на нем.
Когда я делаю
grep -r -o "spring.profiles.active=" text.txt
Результат spring.profiles.active=
Это слово не всегда qa
, может быть prod
или dev
.
То , что я хотел бы сделать , это найти слово spring.profiles.active
и после того, как в =
экстракте этого слова.
Я хотел бы написать скрипт, потому что я использую слово для настройки других элементов на сервере.
Возможно ли это, и если да, то как мне это сделать.
Ответы:
Вы можете использовать
grep
с PCRE (-P
):spring.profiles.active=
будет сопоставлять эту подстроку буквально,\K
будет отбрасывать совпадение[^ ]+
выберет желаемую часть, т.е. часть послеspring.profiles.active=
, до следующего пробелаДля файла:
Пример:
sed
взял бы похожую логику:Пример:
Обработка ошибок:
В вашем скрипте вы можете использовать случай, когда нет совпадения, другими словами, где ваша исходная строка не содержится
spring.profiles.active=
. В приведенном вышеsed
примере вы получите всю исходную строку, которая может создать проблемы:Если вы предпочитаете получать пустую строку при отсутствии совпадений, добавьте
-n
параметр вsed
команду иp
параметр вsed
s
команду, например:Затем вы можете проверить, является ли $ var пустым или нет.
источник
var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"
заменитеfile.txt
на,<<<'...string...'
если ввод - строка, а не файл .. тогда вы можете это сделатьif [ "$var" = 'qa' ]; then do something; else do something; fi
С помощью
awk
или
пример
источник
Я добавлю Perl один в смеси:
-l
: включает автоматическую обработку конца строки. У него есть два отдельных эффекта. Во-первых, он автоматически запускает $ / (разделитель входных записей) при использовании с -n или -p. Во-вторых, он присваивает $ \ (разделителю выходной записи) значение octnum, чтобы в любом операторе печати этот разделитель был добавлен обратно. Если октнум опущен, устанавливает $ \ текущее значение $ /.-a
: включает режим автоматического разделения при использовании с -n или -p. Неявная команда split для массива @F выполняется в качестве первой вещи внутри неявного цикла while, создаваемого -n или -p.n
: заставляет Perl принять следующий цикл вокруг вашей программы, который заставляет его перебирать аргументы имени файла, вроде sed -n или awk:-e
: может использоваться для ввода одной строки программы.источник
perl -nle '/spring.profiles.active=\K([^ ]+)/ && print $1' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'