タイムスタンプで始まる行の後に空の行を追加する方法

タイムスタンプで始まる行の後に空の行を追加する方法

私の現在の会社のログビューの経験はひどいです。特定の期間内にクリーンアップされたログに新しい行を追加したいと思います。毎日新しいラインを手に入れたいです。

日付と時刻の形式は次のとおりです。

2023-10-03 15:34:37

可能であることはわかりますが、trどうすればいいかわかりません。最善の答えを選択します。誰でも新しいファイルに新しいコンテンツを作成する方法を教えてもらえますか?パフォーマンス上の理由からです。私はviを使うのが好きではなく、ログリーダーとしてはあまり使いません。

ベストアンサー1

では、vim次のことができます。

:%s/\v^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}.*/&\r

注意し\vてください素晴らしいしたがって、各項目の前にバックスラッシュを追加する必要はありません{}()

はい、\r代替(線を2つの部分に分割します。:help s/\r予想されるキャリッジリターン文字の代わりに)のフレーズを使用してください。

存在する基準vi( \d, \v,\rnormすべてvim拡張子です。) これに対応する内容は次のとおりです。

:%s/^[[:digit:]]\{4\}\(-[[:digit:]]\{2\}\)\{2\} [[:digit:]]\{2\}\(:[[:digit:]]\{2\}\)\{2\}.*/&^M/

^MCtrl+を押してV入力しEnter^JCR(キャリッジリターンとも呼ばれる)の代わりにLF(ラインフィードとも呼ばれます)を挿入します^M。)

ただし、viCentOSの実装は(少なくともCentOS 4ほど高速でした)、したがって拡張機能をvim使用できます。vimvi

とにかくtr音訳、文字を他の文字に置き換え、削除、または絞り込むツールなので、ここでは使用できません。

sedawkまたは(AFAIK、Perlから派生した正規表現演算子)をperl使用できます。\d

perl -pi -e '$_ .= "\n" if /^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}/' your-file

ファイルinを編集します。または:

perl -p -e '$_ .= "\n" if /^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}/' < your-file > new-file

結果を新しいファイルに入れます。

あるいは、Regex::Common::timeモジュールが利用可能であると仮定すると、次のようになります。

perl -MRegexp::Common=time -p -e '
  $_ .= "\n" if m{^$RE{time}{strftime}{-pat=>"%Y-%m-%d %H:%M:%S"}}
  ' < your-file > new-file

2023-13-00 25:61:62これにより、より厳しい一致が得られます(たとえば、一致しません)。これらの日付と一致する日付がありますが、$RE{time}{iso}日付または時刻コンポーネントがないため、ここで使用できないいくつかの日付を含むISO8601日付の他のバリエーションもたくさんあります。

以下を使用して実際の正規表現を表示できます。

$ perl -MRegexp::Common=time -le 'print $RE{time}{strftime}{-pat=>"%Y-%m-%d %H:%M:%S"}'
(?:(?:\d{4})-(?:(?:(?=[01])(?:0[1-9]|1[012])))-(?:(?:(?=[0123])(?:0[1-9]|[12]\d|3[01]))) (?:(?:(?=[012])(?:[01]\d|2[0123]))):(?:(?:[0-5]\d)):(?:(?:(?=[0-6])(?:[0-5]\d|6[01]))))

おすすめ記事