sed를 사용하여 명령 출력의 일부를 인쇄하는 방법

sed를 사용하여 명령 출력의 일부를 인쇄하는 방법

명령 출력의 일부를 인쇄하려고 합니다.

cat script.sh | grep Xmx 

java -jar -Duser.language=en -Djava.awt.headless=true -Xms1024m -Xmx1024m -Dspring.profiles -Dspring.cloud.config.uri ...*

난 단지 그것을 나열해야합니다 -Xms1024m -Xmx1024m.

다양한 서비스에서 실행해야 하고 스크립트도 다르기 때문에 awkOR를 사용할 수 없습니다 .cut

두 문자(예: 및 ) sed사이에서 선택 문자열을 사용해 보았지만 작동하지 않습니다. 작동하지 않는 이유는 서비스마다 스크립트가 다르기 때문입니다. 일부에는 "-Djava.awt.headless=true" 플래그가 있는 반면 다른 일부에는 그렇지 않습니다.true-Dspringsed -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

관련 정보