次のコマンドをリファクタリングしようとしています。
tail -f production.log |
grep -e "Processing " -e "compatible;" -e "Completed in " -e
以下はコマンドの出力です。
BasketController#cross_sell_product 処理 (2011-08-03 12:46:07 の 85.189.237.x) [POST] "RequestLog", "2011-08-03 12:46:07", "12595", " www. website .com","/basket/cross_sell_product/113","85.189.237.x","Mozilla/5.0 (互換可能; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)" 0.07853で完了(要求1犬/第2)|レンダー:0.01402(17%)| DB:0.01439(18%)| 200 OK [https://www.website.com/basket/cross_sell_product/113]
これは素晴らしく正確に私が望むものですが、ログを塊として研究できるように、後で1〜2回のリターンを見たいと思います。
\n
最後に追加しようとしましたが、うまくいきませんでした。
答え1
あなたが望むものは何であるかよくわかりませんが、awkはおそらく簡単にできるでしょう。一致する各行の後に改行を追加するには:
tail -f production.log |
awk '/Processing|compatible;|Completed in / {print; print ""}'
一致する行の連続していないすべてのブロック間に改行を追加するには:
tail -f production.log |
awk '
/Processing|compatible;|Completed in / {
if (NR == n+1) print "";
n = NR;
print;
}'
答え2
grep
空行はどのパターンとも一致しないため、フィルタリングされます。元のファイルに空白行区切り文字がある場合-e "^$"
。
これらの空行が元のファイルにない場合は、追加する必要があります。これを行う方法の例は次のとおりです。
tail -f production.log | grep -e … | sed 's/\(^Processing \)/\n\1/'
編集する:空行が必要な場合すべて代わりに別の行がsed 's/$/\n/'
使用されます。もちろん\n
好きなだけ追加できます。