私の入力は次のとおりです -
[11/Jul/2016:13:40:43 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:43 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:47 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:47 +0000] "POST --" 500 - 7
[11/Jul/2016:13:41:48 +0000] "POST --" 200 - 7
[11/Jul/2016:13:41:49 +0000] "POST --" 500 - 7
[11/Jul/2016:13:42:12 +0000] "POST --" 500 - 7
13:40から13:41までの行数を入力したいです。この場合、カウントは6です。
私は次のオプションを試しました
echo sed -n '/^START_TIME/,/^END_TIME/ p' somelogfile.log | wc -l
echo sed -n '/^13:40:43$/,/^13:41:43$/ p' somelogfile.log | wc -l
しかし、私はいつも1を取得します。
誰かがこれを確認し、ここで何が間違っているかを教えてもらえますか?
答え1
echo
1行だけが生成され計算されますwc
。
終了タイムスタンプが存在せず、13:41:43
使用されるアンカー(^
および)$
が制限されすぎます。
echo
以下を削除してみてください。
sed -n '/13:40:43/,/13:41:49/p' somelogfile.log | wc -l
答え2
年代順が語彙順と等しい場合は、次のことができます。
awk '$0>="[11/Jul/2016:13:40:00" && $0<="[11/Jul/2016:13:41:59"' file | wc -l
これにより、値が最初の日付以上で、2番目の日付以下かどうかを確認します。awk
コマンドが与えられない場合、その行だけがawk
印刷されます。
答え3
このコマンドを見てみましょう。
echo sed -n '/^13:40:43$/,/^13:41:43$/ p' somelogfile.log | wc -l
echo
パイプを通して何が行われ、何が進行するのか考えてみましょうwc
(ただしないでくださいwc
)。これはあなたがいつも1つを得る理由を説明します1
。作成した正規表現は行の先頭
^
と末尾に固定されていますが、$
もちろんそのタイムスタンプだけが行にあるわけではないので、アンカーを削除する必要があります。終了条件は、例に存在しないタイムスタンプを探すため、一致範囲が終了せず、最初の一致から始まり、すべてが印刷されます。
このようなものが望むことができます(3
現在の質問に表示されている入力ファイルを使用して出力)
sed -ne '/13:40:47/,/13:41:48/p' somelogfile.log | wc -l