정적 및 동적 열 번호 모두에 대해 다음 명령의 출력 형식을 다시 지정하려면 awk를 사용해야 합니다.
ps -eopid,lstart,cmd | grep java |grep -v grep
다음은 awk 명령에 대한 샘플 입력입니다.
17524 Wed May 9 08:50:37 2018 /opt/java/latest/bin/java -client -Xms256m -Xmx512m -XX:CompileThreshold=8000 -XX:PermSize=128m -XX:MaxPermSize=256m -Dweblogic.Name=AdminServer -Djava.security.policy=/app/oracle/wls1036/wlserver_10.3/server/lib/weblogic.policy -Dweblogic.system.BootIdentityFile=/projects/domainName/servers/AdminServer/security/boot.properties -Dweblogic.nodemanager.ServiceEnabled=true -Xverify:none -da -Dplatform.home=/app/oracle/wls1036/wlserver_10.3 -Dwls.home=/app/oracle/wls1036/wlserver_10.3/server -Dweblogic.home=/app/oracle/wls1036/wlserver_10.3/server -Ddomain.home=/projects/domainName -Does.client.home=/app/oracle/wls1036/oesclient -Doracle.home=/app/oracle/wls1036/oesclient -Doracle.security.jps.config=/projects/mydomain/config/oeswlssmconfig/AdminServer/jps-config.xml -Dweblogic.management.discover=true -Dwlw.iterativeDev= -Dwlw.testConsole= -Dwlw.logErrorsToConsole= -Dweblogic.ext.dirs=/app/oracle/wls1036/patch_wls1036/profiles/default/sysext_manifest_classpath:/app/oracle/wls1036/patch_ocp371/profiles/default/sysext_manifest_classpath weblogic.Server
예제 출력:
24519 Wed May 9 23:50:09 2018 -Dweblogic.Name=AdminServer
문제: awk를 사용하여 열 번호를 기준으로 초기 PID, 시작 날짜 및 시간 값을 인쇄할 수 있지만 경우에 따라 마지막 값의 열 번호가 다를 수 있습니다(예: 한 출력의 열 9와 열 번호 다른 열 17에서). "-Dweblogic.Name=" 키워드가 포함된 해당 열 번호에 대해 검색된 마지막 값을 인쇄하고 기존 출력에 추가하려면 어떻게 해야 합니까? 열 번호와 열 검색의 출력을 결합하면 예외가 발생합니다. 이 출력 형식을 보다 쉽게 지정할 수 있는 방법(sed, grep, cut 등)도 환영합니다.
답변1
어쩌면 Dweblogic을 grep한 다음 sed할 수도 있습니다.
search="-Dweblogic.Name="
ps -eopid,lstart,cmd | \
grep "java.*$search" | \
sed -E 's#([^/]* )/.*('"$search"'[^ ]*).*#\1\2#'
답변2
열을 얻으려면 루프를 사용하십시오
| awk '{for(i=NF;i>1;i--)
if ( $i ~ /-Dweblogic.name/ ) { wln=$i; break } ;
printf "... %s ...",wln}'
어디
NF
표현된 필드의 수입니다.for( )
구문은 줄 끝에서 시작 부분까지 반복됩니다.$i ~ /-Dweblogic.name/
-Dweblogic.name=admin1 , -Dweblogic.name=otheradmin과 일치합니다(/^-D/가 자신의 것과 일치하지 않도록 할 수도 있음).
grep java | grep -v grep
마녀가 grep [j]ava
grep 자체를 삭제하지 않고(그리고 동료를 놀라게 하도록) 제안해도 될까요 ?
| awk '/java/ {...} '
또는 최대 인수 수를 사용하여:
| awk '/java/ && NF>10 { ... }'
답변3
사용행복하다(이전 Perl_6)
raku -ne 'my @a = .words; put "@a[0..5] @a.grep(/^ \-Dweblogic\.Name\= /)" if .words > 6;'
입력 예:
17524 Wed May 9 08:50:37 2018 /opt/java/latest/bin/java -client -Xms256m -Xmx512m -XX:CompileThreshold=8000 -XX:PermSize=128m -XX:MaxPermSize=256m -Dweblogic.Name=AdminServer -Djava.security.policy=/app/oracle/wls1036/wlserver_10.3/server/lib/weblogic.policy -Dweblogic.system.BootIdentityFile=/projects/domainName/servers/AdminServer/security/boot.properties -Dweblogic.nodemanager.ServiceEnabled=true -Xverify:none -da -Dplatform.home=/app/oracle/wls1036/wlserver_10.3 -Dwls.home=/app/oracle/wls1036/wlserver_10.3/server -Dweblogic.home=/app/oracle/wls1036/wlserver_10.3/server -Ddomain.home=/projects/domainName -Does.client.home=/app/oracle/wls1036/oesclient -Doracle.home=/app/oracle/wls1036/oesclient -Doracle.security.jps.config=/projects/mydomain/config/oeswlssmconfig/AdminServer/jps-config.xml -Dweblogic.management.discover=true -Dwlw.iterativeDev= -Dwlw.testConsole= -Dwlw.logErrorsToConsole= -Dweblogic.ext.dirs=/app/oracle/wls1036/patch_wls1036/profiles/default/sysext_manifest_classpath:/app/oracle/wls1036/patch_ocp371/profiles/default/sysext_manifest_classpath weblogic.Server
예제 출력:
17524 Wed May 9 08:50:37 2018 -Dweblogic.Name=AdminServer
즉, -ne
라인별 입력은 공백으로 구분된 입력으로 나누어 배열 words
에 할당됩니다 . @a
그런 다음 처음 6개 열(단어 [0..5]
)이 out put
이고 grep
정규식과 일치하는 ping 완료 단어가 나옵니다 /^ \-Dweblogic\.Name\= /
( 다음과 같이 쓸 수도 있음 /^ "-Dweblogic.Name=" /
).
위의 코드는 입력에서 짧거나 빈 줄을 처리하지만 /^ \-Dweblogic\.Name\= /
처음 6개 열(PID 및 타임스탬프)을 찾을 수 없더라도 인쇄합니다. $_
Raku의 테마 변수를 사용하여 이 문제를 극복하는 다음 코드를 사용하는 것이 더 좋습니다 .
raku -ne 'my @a = .words; $_ = @a.grep(/^ \-Dweblogic\.Name\= /); put "@a[0..5] $_" if $_;'