명령 출력의 일부를 인쇄하려고 합니다.
cat script.sh | grep Xmx
java -jar -Duser.language=en -Djava.awt.headless=true -Xms1024m -Xmx1024m -Dspring.profiles -Dspring.cloud.config.uri ...*
난 단지 그것을 나열해야합니다 -Xms1024m -Xmx1024m
.
다양한 서비스에서 실행해야 하고 스크립트도 다르기 때문에 awk
OR를 사용할 수 없습니다 .cut
두 문자(예: 및 ) sed
사이에서 선택 문자열을 사용해 보았지만 작동하지 않습니다. 작동하지 않는 이유는 서비스마다 스크립트가 다르기 때문입니다. 일부에는 "-Djava.awt.headless=true" 플래그가 있는 반면 다른 일부에는 그렇지 않습니다.true
-Dspring
sed -e 's/.*true\(.*\)-Dspring/\1/'
sed
올바른 구문 사용에 대한 통찰력을 제공해주십시오 .
답변1
위의 의견을 바탕으로 항상 두 매개변수를 함께 사용하며 순서는 다음과 같다고 가정하고 다음 명령을 사용할 수 있습니다.
sed -n -e 's/.*\s\(-Xms\S*\s*-Xmx\S*\).*/\1/p' script.sh
일어나는 일은 다음과 같습니다.
이
-n
플래그는 출력이 인쇄되는 것을 방지하지만p
규칙과 일치하는 모든 내용은 sed 표현식 끝에 인쇄됩니다.이 표현식은
\s
공백 및\S
공백이 아닌 문자에 적용됩니다.표현식의 첫 번째 부분은
.*\s
괄호 안의 패턴 앞의 공백 문자까지 줄의 시작 부분을 캡처해야 합니다(캡처 그룹).-Xms\S*
첫 번째 인수와 일치합니다. 로 시작하며-Xms
공백\S*
안의 모든 항목과 일치합니다(예: "1000m" 또는 "1.5G").\s*
공백 문자가 0개 이상 있습니다(\s\s*
분리 보장).-Xmx\S*
원하는 두 번째 인수를 다시 다음 공백까지 일치시킵니다.캡처 그룹을 끄고 나머지 줄을 무시하고 캡처 그룹으로 대체합니다.
정규식을 수행하는 다른 방법은 아마도 수십 가지가 있을 것입니다. 그러나 테스트할 때 가장 먼저 떠오르고 효과가 있었던 방법은 이것이었습니다.
답변2
두 문자열은 항상 서로 옆에 나타나므로 다음 명령을 사용할 수 있습니다.
grep -o "\-Xms[0-9]*[g,m].*[0-9][g,m]" script.sh
산출:
-Xms1024m -Xmx1024m
이는 -Xms256m
또는 또는 와 -Xmx4096m
같이 기가바이트로 지정된 경우 에도 작동합니다 . 파일이나 출력에서 직접 실행할 수 있습니다.-Xms1g
-Xmx8g
답변3
다음을 사용해 볼 수 있습니다 grep
.
grep -o "\-Xms[0-9]*m \-Xmx[0-9]*m" file
산출
-Xms1024m -Xmx1024m