열 번호 및 패턴 일치 조건을 기반으로 AWK 인쇄 열

열 번호 및 패턴 일치 조건을 기반으로 AWK 인쇄 열

정적 및 동적 열 번호 모두에 대해 다음 명령의 출력 형식을 다시 지정하려면 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]avagrep 자체를 삭제하지 않고(그리고 동료를 놀라게 하도록) 제안해도 될까요 ?

| 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 $_;' 

https://raku.org

관련 정보