다음과 같이 여러 프로세스가 실행되고 있습니다.
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+'
-o
grep
적어도 하나의 일치하는 줄이 아닌 일치하는 부분을 출력하도록 지시하는 GNU 확장입니다 .
-P
grep
기본 정규식 대신 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 -> 확장 정규식