1

私は大きなログを持っています。つまり、190 万行を超える大きなログです。「Never」という単語を含まないすべての行とその前の行を正規表現で置き換えてから、-=+ REMOVED +=- に置き換える必要があります。以下はログの例です。

2013-09-17-01:02:43 User: ID_123456@some.tld  
2013-09-17-01:02:43 Last login time: Never  
2013-09-17-01:02:43 User: ID_123458@some.tld  
2013-09-17-01:02:43 Last login time: 2013-09-16  
2013-09-17-01:02:43 User: ID_123423@some.tld  
2013-09-17-01:02:43 Last login time: 2013-09-15  

ユーザーにログイン時間があるので、行とメールアドレスの前の行を削除します。最終出力は次のようになります

2013-09-17-01:02:43 User: ID_123456@some.tld  
2013-09-17-01:02:43 Last login time: Never  
-=+ REMOVED +=-  
-=+ REMOVED +=-  
-=+ REMOVED +=-  
-=+ REMOVED +=-  

簡単なはずですが、私はこの 1 時間頭を悩ませてきました。

もっと学びたいので sed を使用したいと思いますが、何でも受け入れます...

4

3 に答える 3

5

これはうまくいくかもしれません(GNU sed):

 sed '$!N;/\n.*Never/!s/.*/-=+ REMOVED +=-/mg'  file
于 2013-09-17T14:47:53.007 に答える
1

これはそれを作ることができます:

$ rm="-=+ REMOVED +=-"
$ awk -v rm="$rm" 'BEGIN{OFS="\n"}NR%2{a=$0; next} $0~/Never/ {print a,$0; next}{print rm,rm}' a
2013-09-17-01:02:43 User: ID_123456@some.tld  
2013-09-17-01:02:43 Last login time: Never  
-=+ REMOVED +=-
-=+ REMOVED +=-
-=+ REMOVED +=-
-=+ REMOVED +=-

説明

  • -v rm="$rm"「削除された」テキストを格納するために使用されます。
  • BEGIN{OFS="\n"}行区切りを定義します。
  • NR%2{a=$0; next}奇数行の場合は、その行をavar に格納します。 $0~/決して/ {print a,$0; next}{print rm,rm}'削除されin case the line contains "Never", print the previous line (stored inand the current one). Otherwise, print`テキストを 2 回。
于 2013-09-17T13:06:35.413 に答える