0

このような行を含む次のログファイルがあります

1345447800561|FINE|blah@13|txReq
1345447800561|FINE|blah@13|Req
1345447800561|FINE|blah@13|rxReq
1345447800561|FINE|blah@14|txReq
1345447800561|FINE|blah@15|Req 

各行から最初のフィールドを抽出しようとしていますが、それがblah@13またはblah@14のどちらに属しているかに応じて、次のスクリプトを使用して対応するファイルを作成しています。これは、数の点で非常に非効率的です。一時ファイルの作成します。最適化する方法について何か提案はありますか?

cat newLog | grep -i "org.arl.unet.maca.blah@13" >> maca13
cat newLog | grep -i "org.arl.unet.maca.blah@14" >> maca14
cat newLog | grep -i "org.arl.unet.maca.blah@15" >> maca15
 cat maca10 | grep -i "txReq" >> maca10TxFrameNtf_temp
exec<blah10TxFrameNtf_temp
while read line 
do
 echo $line | cut -d '|' -f 1 >>maca10TxFrameNtf
done
cat maca10 | grep -i "Req" >> maca10RxFrameNtf_temp
 while read line 
do
 echo $line | cut -d '|' -f 1 >>maca10TxFrameNtf
done
rm -rf *_temp
4

2 に答える 2

2

このようなもの ?

for m in org.arl.unet.maca.blah@13 org.arl.unet.maca.blah@14 org.arl.unet.maca.blah@15
do
  grep -i "$m" newLog | grep "txReq" | cut -d' ' -f1 > log.$m
done
于 2012-08-20T08:40:33.937 に答える
1

grep/sed の代わりに ex を使用して、temps を使用せずにその場でテキスト ファイルを変更すると便利な場合があります。一時ファイルやそのディレクトリなどの一意性や書き込み可能性について心配する手間が省けます。クリーナー。

kshでは、編集コマンドでコードブロックを使用し、それをexにパイプするだけです...

{
  # Any edit command that would work at the colon prompt of a vi editor will work
  # This one was just a text substitution that would replace all contents of the line
  # at line number ${NUMBER} with the word DATABASE ... which strangely enough was
  # necessary at one time lol
  # The wq is the "write/quit" command as you would enter it at the vi colon prompt
  # which are essentially ex commands.
  print "${NUMBER}s/.*/DATABASE/"
  print "wq"
} | ex filename > /dev/null 2>&1
于 2013-12-17T22:56:12.537 に答える