다른 문자열을 검색한 후 문자열 가져오기

다른 문자열을 검색한 후 문자열 가져오기

다음과 같이 여러 프로세스가 실행되고 있습니다.

User 18870     1  1 09:44 ?        00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true  -Number 1234 -c 1234-SM 
User 18871     1  1 09:44 ?        00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true  -Number 1264 -c 1264-SM 
User 18872     1  1 09:44 ?        00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true  -Number 1634 -c 1634-SM 
User 18873     1  1 09:44 ?        00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true  -Number 2334 -c 2334-SM 

나는 단지 출력을 얻고 싶습니다 -Number 1234. 그 숫자는 프로세스마다 다릅니다. 따라서 다음과 같이 출력해야 합니다.

-Number 1234
-Number 1264
-Number 1634
-Number 2334

아니면 양이 없는게 좋을 것 같아요

1234
1264
1634
2334

답변1

사용awk

awk '{print $21}'

$21기본 구분 기호가 공백임을 고려하면 예상되는 출력은 어디에 있습니까?

$ echo "User 18870     1  1 09:44 ?        00:03:11 java -DENV_SYSTEM_DETAILS=linux-gnu2.6.32 -DENV_PROJECT_NAME=TEST -DENV__APP_PATH=/opt/enterprise/V2.0 -DENV_DATABASE_PATH=/opt/ORACLE11G -Dswing.aatext=true -Xms512m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+OptimizeStringConcat -DsuppressSwingDropSupport=true  -Number 1234 -c 1234-SM" | awk '{print $21}'
1234

답변2

GNU grep또는 호환 제품을 사용하세요.

ps -wwAo args= | grep -Po '^java.* -Number\s+\K\S+'

-ogrep적어도 하나의 일치하는 줄이 아닌 일치하는 부분을 출력하도록 지시하는 GNU 확장입니다 .

-Pgrep기본 정규식 대신 Perl 호환 정규식을 사용하도록 지시하는 또 다른 GNU 확장입니다 .

\K일치하는 부분의 시작을 재설정하는 데 사용되는 Perl 정규식 연산자입니다. 따라서 일치하는 부분은 +그 뒤에 나오는 하나 이상의 ( ) 공백이 아닌 문자 ( )의 시퀀스 입니다 .\S-Number<whitespaces>

ps -Ao args=모든 프로세스에 대한 모든 매개변수 목록을 나열하는 POSIX 명령입니다(공백으로 연결됨). 일부 구현 -w에서 지원되는 확장 입니다 .ps더 넓게(많은 ps구현에서는 그렇지 않으면 잘립니다.)

답변3

더 안전하고 간단한 솔루션은 프로세스를 나열하는 데 사용하는 도구에서 제공하는 필터링 기능을 사용하는 것입니다.

즉, sed이식성과 오탐 최소화를 고려하여 다음을 통해 텍스트를 전송할 수 있습니다.

sed -n -e 's/.*[[:blank:]]\{1,\}-Number[[:blank:]]\{1,\}\([0123456789]\{1,\}\).*/\1/p'

줄에 하나 이상의 공백 문자, 텍스트, -Number하나 이상의 공백 문자, 하나 이상의 숫자가 포함된 경우 전체 줄은 캡처된 일련의 숫자( 로 묶인 부분 \( \))로 대체되고 결과는 다음과 같습니다. 인쇄되었습니다.
위의 순서가 한 줄에서 여러 번 반복되면 첫 번째 숫자만 인쇄됩니다.

보다 간결한 AWK 대안은 -Number데이터 예제에 표시된 것처럼 및 다음 숫자 시퀀스가 ​​단일 공백으로 구분되어 있다고 가정합니다.

awk -v RS=' ' '/^-Number$/ { getline; print; }'

이는 공백으로 구분된 각 단일 문자열을 하나의 레코드로 처리합니다. -Number이 문자열로만 구성된 레코드가 발견 되면 다음 레코드를 읽고 인쇄합니다.

답변4

oE와 함께 grep 사용

grep -oE "\-Number(.*?)\s-" | grep -oE [[:digit:]]+

-o -> 일치하는 문자열만 출력 -E -> 확장 정규식

관련 정보