2009-09-24 17 views
10

た後、私はラインの形式は、私はコマンドラインの一部を取得するグレップ

を使用

aNumber timestamp commandInformation 

である私は、特定の部分を抽出する必要があり、そこから私のUNIXサーバー上の巨大なファイル

を持っています

grep LATENCY file.log | grep CMDTYPE=NEW 

私が望む特定の行を除外します。私は部分タイムスタンプと、行からの最後の9文字を返すだけで、完全な行ではない。どうやってやるの?

答えて

10

使用awk(1)

awk ' { print $2" "substr($0,length($0)-8) }' 
+1

+1仕事をする必要があります:) –

1

次のようにあなたがawkを使用することはできません。

grep LATENCY file.log | grep CMDTYPE=NEW | awk '{print $2,substr($0,length($0)-9,9)}' 
+0

は$ 0使用しないでしょうあなたが最後に表示し確認してください3番目の単語の終わりの代わりに行の? –

+0

@ヤニック:はい、私は 'commandInformation'が単なる1ワードにすぎないとは思わなかった。ありがとうございました! –

0

のgrepを使用する必要が、awkは、同様のことを行うことができます。

awk '/LATENCY/ && /CMDTYPE=NEW/ {print $2 " " substr($0, length($0)-8)}' file 
2

を私は」私はここでawkよりも良い選択肢だと主張するつもりです:

perl -ne 'next if ! (/LATENCY|CMDTYPE=NEW/ && /^\d+.*\s+(.*)\s+.*(.{9})$/); print "$2 $3\n";' 

正規表現はより堅牢で、厳密なパターンと一致しない行を省略することができます。上記のawkスクリプトは、substr呼び出しのオーバーフローを見るつもりです(ログの終わりから部分行のように壊れた入力を入力すると、正直言って、負のインデックスがawkで何をするのかわかりません)。あなたが一人でSEDですべてを行うことができ

0

 
$ echo "234432 12:44:22.432095 LATENCY blah CMDTYPE=NEW foo bar 123456789" | \ 
sed -n '/LATENCY/!b;/CMDTYPE=NEW/!b;s/^.\+\s\+\([0-9:.]\+\)\s.\+\(.........\)$/\1 \2/; p' 
12:44:22.432095 123456789 
9

cutは私よりも高速であるために

grep something somewhere | grep againsomething | cut -f2 -d' ' 
関連する問題