grep / sed / awk를 사용하여 문자열에서 단어 추출


12

나는 끈이있다

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

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

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


나는 이것에 관한 메타 대화가 이미 있다고 추측하고 있지만,이 질문은 우분투에만 국한되지 않습니다. unix.stackexchange.com 대신 왜 여기 있습니까?
Tony Adams

@TonyAdams 그렇습니다 : 텍스트 처리 질문은 여기 에서 간접적으로 다루어졌으며 , 어쨌든 그들은 항상 주제로 간주되어 닫히거나 마이그레이션되지 않았습니다. 우분투 특유성에 대해서는 여러 번, 최근 두 번, 여기 에서 두 번, 여기 에서 한 번 다루었 습니다 .
kos

좋은 질문! : D
ncomputers

답변:


20

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이 비어 있는지 테스트 할 수 있습니다.


감사합니다 @heemay, 완벽하게 작동합니다. 이제 스크립트 만 작성하면됩니다. 답변으로 표시합니다.
Gman

@heemay이 스크립트를 어떻게 작성했는지 알 수있을 것입니다. 스크립트에 포함되어 있으며 실행하면 qa를 반환합니다. env라는 변수에 결과를 저장하고 그와 비슷한 것을 비교하고 싶습니다. [env == qa]이면; 다음 // 무언가를 ... 다른 무언가를 ...
Gman

1
그래 @Gman .. 단지 명령 치환을 사용 var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"대신 file.txt<<<'...string...'입력 된 문자열이 아니라 당신이 할 수있는 file..then 경우if [ "$var" = 'qa' ]; then do something; else do something; fi
heemayl

1

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

믹스에서 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

원래 정규식도 다음과 같이 사용할 수 있습니다.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'
Manwe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.