一致する2つの列の間に列値のみを印刷する方法

一致する2つの列の間に列値のみを印刷する方法

/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すべてのスペースを1つに圧縮します。cut行の10番目の単語だけが最後に提供されます。

更新:コメントで指摘したように、最初のコマンドは文字列から不要な尾を削除しません。修正されたバージョンは次のとおりです。

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

申し訳ありません。正規表現の明白な使用を避ける方法がわかりません。

関連情報