0

分数を指定できる小さな bash スクリプトを作成しようとしています。これにより、過去 X 分間のログ ファイルの行が表示されます。行を取得するために、sedを使用しています

sed -n '/time/,/time/p' LOGFILE

CLI ではこれは完全に機能しますが、私のスクリプトでは機能しません。

# Get date
now=$(date "+%Y-%m-%d %T")

# Get date minus X number of minutes -- $1 first argument, minutes
then=$(date -d "-$1 minutes" +"%Y-%m-%d %T")

# Filter logs -- $2 second argument, filename
sed -n '/'$then'/,/'$now'/p' $2

私はさまざまなアプローチを試しましたが、どれもうまくいかないようです:

result=$(sed -n '/"$then"/,/"$now"/p' $2)
sed -n "/'$then'/,/'$now'/p" "$2"
sed -n "/$then/,/$now/p" $2
sed -n "/$then/,/$now/p" "$2

何か提案はありますか?私はDebian 5を使用しています、echo $SHELLと言う/bin/sh

編集:スクリプトは出力を生成しないため、エラーは表示されません。ログファイルでは、すべてのエントリが次のような日付で始まります2013-05-15 14:21:42,794

4

2 に答える 2

1

主な問題は、文字列照合による算術比較を実行しようとすることだと思います。sed -n '/23/,/27/p'を含む最初の行と を含む23次の行の間の行を提供します27(さらに、 を含む次の行から を含む23次の行まで27など)。23 から 27 までの数字を含むすべての行が表示されるわけではありません。

19
22
24
26
27
30

何も出力しません ( がないため23)。文字列マッチングを使用する awk ソリューションにも同じ問題があります。したがって、then日付文字列がログ ファイルに逐語的に出現しない限り、メソッドは失敗します。日付文字列を数値に変換し ( -<space>、および を削除:)、文字列の一致ではなく算術比較を使用して、結果の数値が正しい範囲内にあるかどうかを確認する必要があります。これは sed の機能を超えています。awk と perl を使用すると、かなり簡単に実行できます。これがperlソリューションです:

#!/bin/bash

NOW=$(date "+%Y%m%d%H%M%S")
THEN=$(date -d "-$1 minutes" "+%Y%m%d%H%M%S")

perl -wne '
  if (m/^(....)-(..)-(..) (..):(..):(..)/) {
    $date = "$1$2$3$4$5$6";
    if ($date >= '"$THEN"' && $date <= '"$NOW"') {
      print;
    }
  }' "$2"
于 2013-05-15T17:23:43.657 に答える
1

ネストされた引用符で頭を悩ませないでください。-vオプションを使用してawk、シェル変数の値をスクリプトに渡します。

#!/bin/bash

# Get date
now=$(date "+%Y-%m-%d %T")

# Get date minus X number of minutes -- $1 first argument, minutes
delta=$(date -d "-$1 minutes" +"%Y-%m-%d %T")

# Filter logs -- $2 second argument, filename
awk -v n="$now" -v d="$delta" '$0~n,$0~d' $2

また、シェル組み込みの変数名を使用しないでくださいthen

于 2013-05-15T12:01:37.130 に答える