私の現在の会社のログビューの経験はひどいです。特定の期間内にクリーンアップされたログに新しい行を追加したいと思います。毎日新しいラインを手に入れたいです。
日付と時刻の形式は次のとおりです。
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
,\r
はnorm
すべてvim
拡張子です。) これに対応する内容は次のとおりです。
:%s/^[[:digit:]]\{4\}\(-[[:digit:]]\{2\}\)\{2\} [[:digit:]]\{2\}\(:[[:digit:]]\{2\}\)\{2\}.*/&^M/
^M
Ctrl+を押してV入力しEnter(^J
CR(キャリッジリターンとも呼ばれる)の代わりにLF(ラインフィードとも呼ばれます)を挿入します^M
。)
ただし、vi
CentOSの実装は(少なくともCentOS 4ほど高速でした)、したがって拡張機能をvim
使用できます。vim
vi
とにかくtr
音訳、文字を他の文字に置き換え、削除、または絞り込むツールなので、ここでは使用できません。
sed
、awk
または(AFAIK、Perlから派生した正規表現演算子)をperl
使用できます。\d
perl -pi -e '$_ .= "\n" if /^\d{4}(-\d{2}){2} \d{2}(:\d{2}){2}/' your-file
ファイルi
nを編集します。または:
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]))))
答え2
このコマンドは次のとおりです。
押し:てください。
g/\v\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/normal o
説明する:
g
:globalの略で、正規表現に一致するすべての行に対してコマンドを実行します。\v
: 正規表現の作成「幻想的」(本名)。特殊文字をエスケープする必要がないという意味です。/^\d\{4\}-\d\{2\}-\d\{2\} \d\{2\}:\d\{2\}:\d\{2\}/
:は正規表現です。次のツールに入れてください。https://regexr.com/またはhttps://regex101.com/、彼らはそれを非常によく説明しましたnormal o
:共通コマンド実行パラメータノーマルモード。この場合、押すとo
新しい行が開きます。
公式文書の説明を読んでください ::help global
、、:help \v
:help normal