次の形式のタイムスタンプ付きファイル名のリストがあります。
cat files
一定の範囲を取得する必要があります。そのためには、SEDを使用したいと思います。
sed -n '/201807010112/,/201807030112/p'
私の最初の試みでしたが、sedは時間と分を奇妙に扱い、長い話を短くすると、この形式を正しく理解できません。
私は雑草に巻き込まれているかもしれませんが、これを解決するために、フォーマットをSEDが理解できるものに変換することにしました。
cat files | sed -e "s/\([0-9]\{12\}\}/$(date -f '%Y%m%d%H%M' \1)/g"
私の問題は、一致の結果を日付変換ブロックで使用できないことです\ 1。
これを行う方法、または日付の範囲を取得するためのより良い方法はありますか?
あなたの質問は、特定の日付範囲のいくつかのログファイルの名前を取得する必要があると述べています。
テキストファイルにファイル名があるという事実を無視し、代わりに、あるディレクトリ$logdir
のファイルに直接アクセスできると仮定しましょう。
ファイル名の形式は*_YYYYMMDDhhmmss.log
です。ここで、終了ビットは標準のタイムスタンプ文字列です。
*_201807010112.log
と*_201807030112.log
の間のファイルをループで取得するには(それぞれに何かを行うため)、(bash
内)を使用します。
process_flag=0
for pathname in "$logdir"/*_??????????????.log
do
if [ "$process_flag" -eq 0 ]; then
if [[ "$pathname" == *_201807010112.log ]]; then
process_flag=1
else
continue
fi
fi
# Do some sort of processing of
# the logfile in "$pathname" here.
# When done...
if [[ "$pathname" == *_201807030112.log ]]; then
break
fi
done
このループは、同様のファイル名形式のallログファイルをループします。ループは、辞書式順序でパス名を繰り返し処理します。すべてのファイルのファイル名プレフィックスが同じであると想定されています(これについては何も言わないでください)。
ループの最初の部分は、範囲内の最初のファイルを検出し、そのファイルが見つかるとprocess_flag
を1
に設定します。 process_flag
を1
に設定すると、ループは、実行する必要のあるファイルの処理に実際に"$pathname"
を使用する中間ビットに入ることができます。
次の反復を続行する前に、最後のif
ステートメントは、現在の$pathname
が処理したい最後のファイルと一致するかどうかを確認します。含まれている場合、ループはbreak
ステートメントで終了します。
そこで、date関数を使用してフォームを変換するのではなく、より多くのSEDを使用することにしました。
catファイル
..._ 201807010112.log
..._ 201807010132.log
..._ 201807010152.log
..._ 201807010202.log
日付はYYYYmmddHHSSの形式で、次の形式に変換しました。
YYYY-mm-dd HH:SSは、SEDでこの正規表現を使用します。
cat files | sed -e 's/\(_[0-9]\{4\}\)\([0-9]\{2\}\) \
\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\) \/\1-\2-\3 \4:\5/g'
次に、そこから日付に基づいて範囲を指定するのは簡単なことでした。
| sed -n '/2018-07-01 01:20/,/2018-07-02 02:01/p'
私にとって最大のポイントは、SEDの範囲パターンオプションを利用するための適切な日時形式を知っていることでした。