grep / sed / awk를 사용하여 문자열에서 단어 추출 할 때 grep -r -o “spring.profiles.active=”

나는 끈이있다

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= 단어 그 추출물.

서버에서 다른 항목을 구성 하는 단어 를 사용하기 때문에 이것을 스크립트로 작성하고 싶습니다 .

이것이 가능합니까? 그렇다면 어떻게합니까?



답변

grepPCRE ( -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명령에 추가하십시오 .psed 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이 비어 있는지 테스트 할 수 있습니다.


답변

사용 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

답변

믹스에서 Perl을 던질 것입니다.

<<<'string' perl -lane '$F[3]=~s/.*?=//;print($F[3])'
  • -l: 자동 라인 엔딩 처리를 활성화합니다. 두 가지 별도의 효과가 있습니다. 먼저, -n 또는 -p와 함께 사용하면 $ / (입력 레코드 구분 기호)가 자동으로 숨겨집니다. 둘째, $ \ (출력 레코드 구분 기호)가 octnum 값을 갖도록 지정하여 모든 print 문에 해당 구분 기호가 다시 추가되도록합니다. octnum을 생략하면 $ \를 현재 값 $ /로 설정합니다.
  • -a: -n 또는 -p와 함께 사용하면 자동 분리 모드를 켭니다. @F 배열에 대한 암시 적 분할 명령은 -n 또는 -p에 의해 생성 된 암시 적 while 루프 내에서 첫 번째로 수행됩니다.
  • 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