1

データエントリが次のようなログファイルがあります。各エントリはで始まりtime: ます。特定の時間以降のエントリのみを印刷します。たとえば、の後time : 20130309235926にすべてのレコードを印刷したいので、私の場合は最後の2つのレコードを印刷する必要があります。

これを行うためのsedコマンドはありますか?

time: 20130309235926
dn: 
changetype: modify
-
replace: modifiersname
modifiersname: 
 dc=
-
replace: modifytimestamp
modifytimestamp: 20130310045926Z
-

time: 20130309235959
dn:
changetype: modify
-
replace: modifiersname
modifiersname: 
 dc=
-
replace: modifytimestamp
modifytimestamp: 20130310045926Z
-

time: 20130308025010
dn: 
changetype: modify
-
replace: modifiersname
modifiersname: 
 dc=
-
replace: modifytimestamp
modifytimestamp: 20130310045926Z
-
4

2 に答える 2

1

私は段落のようなことをするためのperlが好きです:

perl -00 -ne '$t = (/time: (\d+)/)[0]; print if $t gt "20130309235926"'

フラグは、段落内の-00入力を提供します(空の行で区切られます)

于 2013-03-12T22:56:39.193 に答える
1

sed算術演算を行うのは難しいため、正確に一致するかどうかは時間によって異なります。たとえば、完全一致の場合、このコマンドは-nスイッチを使用して自動印刷を無効にし、範囲を使用して時間に一致する行からファイルの終わりまでを印刷します ( $)。

sed -n '/time:[ ]*20130309235926/,$ p' infile

編集して前のコマンドを修正します。

sed -n '

  ## When found a blank line between a line with your time and end of file,
  ## jump to label "a".
  /time:[ ]*20130309235926/,$ { 
    /^[ ]*$/ ba
  };

  ## Skip all lines until previous condition be true.
  b;

  ## Label "a".
  :a;

  ## Save all content from next entry until end of file.
  $! { 
    N; 
    ba 
  }; 

  ## Remove extra newline and print.
  s/^\n//; 
  p

' infile  

編集して、前のコマンドを 1 行で追加します。

sed -n '/time:[ ]*20130309235926/,$ { /^[ ]*$/ ba }; b; :a; $! { N; ba }; s/^\n//; p' infile
于 2013-03-12T21:50:41.790 に答える