Слово извлечения от строки с помощью grep/sed/awk

У меня есть строка

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 и после = извлеките то слово.

Я хотел бы к сценарию оболочки это, потому что я использую слово для конфигурирования других объектов на сервере.

Действительно ли это возможно и если так, как я делаю это.

12
задан 12 November 2015 в 04:53

3 ответа

Вы можете использовать grep с PCRE (-P):

grep -Po 'spring.profiles.active=\K[^ ]+' <<<'.....string.....'
  • spring.profiles.active= будет соответствовать этой подстроке буквально, \K откажется от матча

  • [^ ]+, выберет желаемую часть т.е. часть после spring.profiles.active=, до следующего пространства

Для файла:

grep -Po 'spring.profiles.active=\K[^ ]+' file.txt

Пример:

% grep -Po 'spring.profiles.active=\K[^ ]+' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa
<час>

sed взял бы подобную логику:

sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'.....string.....'

Пример:

% sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

Ошибки из-за неправильного обращения:

В Вашем сценарии Вы можете хотеть обращаться со случаем, где там не идет ни в какое сравнение, другими словами, где Ваша оригинальная последовательность не содержит spring.profiles.active=. В вышеупомянутом sed пример, Вы получаете целую оригинальную последовательность, которая могла создать проблемы:

% var="$(sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var
00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256

, Если Вы предпочитаете получать пустую последовательность, когда там не идет ни в какое сравнение, добавьте -n выбор к эти sed команда и p выбор к sed s команда, как это:

% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var

% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256')"
% echo $var
qa

Тогда Вы можете проверить, пуст ли $var или нет.

17
ответ дан 23 November 2019 в 03:35

Используя awk

awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'your_string'

или

awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' your_file
<час>

Пример

% awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa
1
ответ дан 23 November 2019 в 03:35

Я брошу Perl один в соединение:

<<<'string' perl -lane '$F[3]=~s/.*?=//;print($F[3])'
  • -l: позволяет автоматическую заканчивающую линию обработку. Это имеет два отдельных эффекта. Во-первых, это автоматически громко жует $ / (входной сепаратор отчета), когда используется с-n или-p. Во-вторых, это поручает $\\(сепаратор отчета продукции) иметь ценность octnum так, чтобы у любых заявлений печати был тот сепаратор включенным назад. Если octnum опущен, $наборов \\к текущей стоимости $/.
  • -a: включает способ авторазделения, когда он используется с-n или-p. Неявная команда разделения ко множеству @F сделана как первая вещь в неявном в то время как петля, произведенная-n или-p.
  • n: Perl причин, чтобы принять следующую петлю вокруг Вашей программы, которая заставляет его повторить по аргументам имени файла несколько как sed-n или awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
    
  • -e: может использоваться, чтобы войти в одну линию программы.
% <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256' perl -lane '$F[3]=~s/.*?=//;print($F[3])'
qa
1
ответ дан 23 November 2019 в 03:35

Другие вопросы по тегам:

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