私のログファイルには次のものがあります。
[2.09 10:23:56]
[23.09 10:3:56]
[23.09 10:23:56] Some other thing
[23.09 10:23:56]
[23.09 10:23:56]
[23.09 10:23:5]
[23.09 10:23:56] Something
[23.09 10:23:56]
sedを使用して「空の」行(タイムスタンプのみを含む行)を削除しようとしています。私は以下を試しました:
sed -i '/\[\d{1,2}\.\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}\] ($|\R)/d' file
sed -i '/\[[0-9][0-9]?\.[0-9][0-9]? [0-9][0-9]?:[0-9][0-9]?:[0-9][0-9]?\] \n/d' file
sed -i '/\[[0-9][0-9]?\.[0-9][0-9]? [0-9][0-9]?:[0-9][0-9]?:[0-9][0-9]?\] ($|\R)/d' file
しかし、何も動作しないようです。
助けてくれてありがとう!
答え1
私が知っている限り、行の先頭の括弧内の日付文字列に一致する式を作成する必要はありません。
$ grep -v -x '\[[^]]*\][[:blank:]]*' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something
上記のコマンドは、[like this]
角かっこで囲まれた文字列()で始まり、オプションの末尾の空白のみを含む行を削除します。
それでsed
、これは次のようになります
$ sed '/^\[[^]]*\][[:blank:]]*$/ d' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something
式は\[[^]]*\]
リテラルで始まり、[
その後にゼロ個以上の非文字が続き、]
最後にリテラルが続きます]
。
を使用してawk
フィールド区切り記号をに設定できます][[:blank:]]*
。つまり、]
末尾のタイムスタンプ(およびその後のすべてのスペース)が2つのフィールド間の区切り文字になります。 2番目のフィールドが空の場合、現在の行は印刷されません。
$ awk -F '][[:blank:]]*' '$2 != ""' file
[23.09 10:23:56] Some other thing
[23.09 10:23:56] Something
〜のようにクワジモドawk 'NF > 2' file
を使用すると、質問に提供されているサンプルデータでも機能するというコメント(現在削除済み)で指摘されています。この方法は、awk
基本的に行が空のフィールドに分割されるという事実に依存します。このバリエーションは各行の詳細を考慮せず、空白で区切られたフィールドが2つ以上ある行を除くすべての行を削除します。
答え2
sed '/^\[[0-9]\{1,2\}\.[0-9]\{1,2\} [0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\}\] $/ d'
- sedはサポートされていません
\d
。 - 数量子は
{...}
バックスラッシュで囲む必要があります(を使用しない限り-E
)。 - 代替は
|
バックスラッシュでなければなりません(-E
使用しない限り)。 - オプションの記号は
?
バックスラッシュでなければなりません(-E
使用しない限り)。