タイムスタンプが2つのタイムスタンプの間にあるかどうかを確認するいくつかの方法を検索して見つけましたが、すべての方法方法仮定 HH:MM:SS
形式のみを考慮せず、形式のみを考慮してください。日付。
私の実際のシナリオは、日付とミリ秒を含む一般的な形式のログファイルの入力タイムスタンプです2019-11-11 19:05:55,823
。
与えられたタイムスタンプがあるとします2019-11-11 19:05:55,823
。それが範囲内にあるか外にあるかをどうやって確認しますか?
2019-11-11 17:02:54,479
2019-11-12 05:13:55,998
?
答え1
特にbashの場合は問題になります。
start='2019-11-11 17:02:54,479'
end='2019-11-12 05:13:55,998'
date='2019-11-11 19:05:55,823'
if LC_ALL=C command eval '[[ ! $date < $start && ! $date > $end ]]'; then
echo the date is in the range
fi
これは語彙比較を実行します。これは、Cロケールでは、これらの日付表現が語彙と時系列で同じであるために機能します。
bash
演算子は文字列を比較する[[ < / > ]]
ために使用されるため、ローカライズされたソートstrcoll()
アルゴリズムが使用されます。 Cロケールではstrcoll()
と同じ意味ですstrcmp()
。他のロケールはそのロケールの規則に従って比較されるため、結果について多くの保証を受けることはできません。
POSIXlyでは、次のものを使用できます。
if LC_ALL=C expr "x $date" '>=' "x $start" '&' "x $date" '<=' "x $end" > /dev/null; then
echo the date is in the range
fi
awk
これでログファイルで作業している場合は、タイムスタンプが各行の先頭にあると仮定してこれを実行できます。
LC_ALL=C awk -v start='2019-11-11 17:02:54,479' \
-v end='2019-11-12 05:13:55,998' '
$0 >= start && $0 <= end' < file.log
この範囲のタイムスタンプで始まる行が印刷されます。