セクション交換方法でSed Regexキャプチャグループを使用する

セクション交換方法でSed Regexキャプチャグループを使用する

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

cat files
  • ..201807010112。丸太
  • ..201807020112。丸太
  • ..201807022359。丸太
  • ..201807030112。丸太
  • ..201807010412。丸太

特定の範囲を取得する必要があり、そのために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日付変換ブロックから。

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

ベストアンサー1

あなたの質問は、特定の日付範囲内の特定のログファイル名を取得する必要があることを示しています。

ファイル名がテキストファイルにあることを無視し、代わりにディレクトリ内のファイルに直接アクセスできるとします$logdir

ファイル名の形式は、末尾の*_YYYYMMDDhhmmss.logビットが標準タイムスタンプ文字列であることです。

*_201807010112.logループの内外からファイルをインポートするには、*_201807030112.log(各ファイルに対して操作を実行する)(in 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

このようなサイクルがあります。みんな同様のファイル名形式のログファイルです。このループはアルファベット順にパス名を繰り返します。すべてのファイルに同じファイル名のプレフィックスがあるとします(これについては何も言わなかった)。

ループの最初の部分は範囲内の最初のファイルを検出し、そのファイルが見つかった時間をprocess_flag設定します。実行する必要があるファイル操作を処理するために実際に使用する中間ビットにループが入るように設定1します。process_flag1"$pathname"

次の反復を続行する前に、最後のステートメントifは、現在の$pathnameファイルが処理する最後のファイルと一致することを確認します。もしそうなら、ループはbreakステートメントで終わります。

おすすめ記事