일치하는 두 열 사이에 열 값만 인쇄하는 방법

일치하는 두 열 사이에 열 값만 인쇄하는 방법

/tmp/ggloc.log다음 데이터가 포함된 파일이 있습니다 .

$ cat /tmp/ggloc.log
oracle    12061      1  1 Sep08 ?        10:44:07 ./mgr PARAMFILE /oracle/gg/dirprm/mgr.prm REPORTFILE /oracle/gg/dirrpt/MGR.rpt PROCESSID MGR USESUBDIRS
oracle    75841  75810  0 13:55 ?        00:00:00 grep -i mgr
postfix  103283 103268  0 Feb24 ?        00:02:18 qmgr -l -t unix -u
oracle   185935      1  0 Sep08 ?        00:14:14 ./mgr PARAMFILE /oracle/GG_123012/GG_HOME/dirprm/mgr.prm REPORTFILE /oracle/GG_123012/GG_HOME/dirrpt/MGR.rpt PROCESSID MGR

따라서 위 파일에서 다음 출력을 원합니다.

/oracle/gg
/oracle/GG_123012/GG_HOME

나는 다음과 같이 시도했다

k=$(cat /tmp/ggloc.log)
echo "$k" | sed 's/.*PARAMFILE \(.*\) REPORTFILE.*/\1/' | awk -F "/dirprm" '{print $1}'

내 출력은 다음과 같습니다

/oracle/gg
oracle    75841  75810  0 13:55 ?        00:00:00 grep -i mgr
postfix  103283 103268  0 Feb24 ?        00:02:18 qmgr -l -t unix -u
/oracle/GG_123012/GG_HOME

그렇다면 어떻게 얻을 수 있습니까?

/oracle/gg
/oracle/GG_123012/GG_HOME

귀하의 의견이 필요합니다

답변1

생각하다해당 단어가 포함된 줄을 찾은 PARAMFILE다음 그 뒤에 가장 긴 문자열을 인쇄 PARAMFILE하고 마지막 단어까지 공백을 인쇄합니다 /dirprm. 그렇다면 다음을 시도해 볼 수 있습니다.

$ sed -En 's/.*PARAMFILE (.*)\/dirprm.*/\1/p' file
/oracle/gg
/oracle/GG_123012/GG_HOME

또는 sed지원하지 않는 경우 -E:

$ sed -n 's/.*PARAMFILE \(.*\)\/dirprm.*/\1/p' file
/oracle/gg
/oracle/GG_123012/GG_HOME

심지어

$ awk '$9=="PARAMFILE"{sub("/dirprm.*","",$10); print $10}' file
/oracle/gg
/oracle/GG_123012/GG_HOME

또는 마지막 항목 대신 첫 번째 항목을 원하는 경우 /dirpm:

$ perl -lne 'print $1 if s/.*PARAMFILE (.*?)\/dirprm.*/\1/' file
/oracle/gg
/oracle/GG_123012/GG_HOME

답변2

grepGNU를 사용하여 다음 옵션으로 작업을 수행 할 수 있습니다 -P.

$ grep -oP '(?<=PARAMFILE ).*(?=/dirprm)' /tmp/ggloc.log 
/oracle/gg
/oracle/GG_123012/GG_HOME

답변3

정규식 사용에 그다지 관심이 없다면 다음의 또 다른 유용한 솔루션을 참조하세요.

grep PARAMFILE file | tr -s ' ' | cut -f10 -d' '

grepPARAMFILE이 포함된 행만 제공합니다. tr모든 공간을 하나로 압축합니다. cut줄의 10번째 단어만 마지막에 제공됩니다.

업데이트: 주석에서 지적했듯이 첫 번째 명령은 문자열에서 원하지 않는 꼬리를 제거하지 않습니다. 수정된 버전은 다음과 같습니다.

grep PARAMFILE q | tr -s ' ' | cut -f10 -d' '| sed 's/\/dirprm\/mgr.prm//'

죄송합니다. 정규 표현식의 명백한 사용을 피하는 방법을 모르겠습니다.

관련 정보