次の形式のタイムスタンプファイル名のリストがあります。
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_flag
1
"$pathname"
次の反復を続行する前に、最後のステートメントif
は、現在の$pathname
ファイルが処理する最後のファイルと一致することを確認します。もしそうなら、ループはbreak
ステートメントで終わります。
答え2
だから私は使用しないことにしました日付フォームを変換する関数を使用するには、代わりにSEDをもっと使いましょう!
猫ファイル
..._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スコープモードオプションを使用して正しい日付時刻形式を理解したことです。