나는 끈이있다
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
) 와 함께 사용할 수 있습니다 .
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이 비어 있는지 테스트 할 수 있습니다.
답변
사용 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