web-dev-qa-db-ja.com

セクションの置換方法でSed Regex CaptureGroupを使用

次の形式のタイムスタンプ付きファイル名のリストがあります。

cat files
  • ..201807010112。log
  • ..201807020112。log
  • ..201807022359。log
  • ..201807030112。log
  • ..201807010412。log

一定の範囲を取得する必要があります。そのためには、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

これを行う方法、または日付の範囲を取得するためのより良い方法はありますか?

2
Proximo

あなたの質問は、特定の日付範囲のいくつかのログファイルの名前を取得する必要があると述べています。

テキストファイルにファイル名があるという事実を無視し、代わりに、あるディレクトリ$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_flag1に設定します。 process_flag1に設定すると、ループは、実行する必要のあるファイルの処理に実際に"$pathname"を使用する中間ビットに入ることができます。

次の反復を続行する前に、最後のifステートメントは、現在の$pathnameが処理したい最後のファイルと一致するかどうかを確認します。含まれている場合、ループはbreakステートメントで終了します。

1
Kusalananda

そこで、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の範囲パターンオプションを利用するための適切な日時形式を知っていることでした。

0
Proximo