awk cliでインデントされていない行をレコード区切り文字として使用する方法

awk cliでインデントされていない行をレコード区切り文字として使用する方法

次のログファイルがあります。

2016-05-31 09:54:36 (16667) heritage_w?
  From: ip68-8-49-100.sd.sd.cox.net
  User: user1wizard (wizard)
  Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
  Referer: http://dbase.apollo3.com/heritage_w?i=290
  #accesses 3,435 (#welcome 415) since 03/07/2012
2016-05-31 09:54:41 (16677) heritage_w?w=
  From: ip68-8-49-100.sd.sd.cox.net
  User: user1wizard (wizard)
  Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
  Referer: http://dbase.apollo3.com/heritage_w?
  #accesses 3,436 (#welcome 416) since 03/07/2012
2016-06-01 04:07:06 (22190) heritage_w?m=MOD_IND;i=88
  From: ubunzeus
  User: user2 (wizard)
  Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36
  Referer: http://dbase.apollo3.com/heritage_w?i=88
  #accesses 3,623 (#welcome 441) since 03/07/2012    
2016-06-01 04:07:38 (22255) heritage_w?m=MOD_FAM;i=28;ip=88
  From: ubunzeus
  User: user2 (wizard)
  Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36
  Referer: http://dbase.apollo3.com/heritage_w?m=MOD_IND;i=88
  #accesses 3,624 (#welcome 441) since 03/07/2012

私はレコード区切り記号で歪みのない行を取得しようとしていますRS

次のようなコードを使用します。

$ gawk 'BEGIN{RS="^2016"}; /user1/ {print}'

「user1」を含むレコードだけを印刷したいです。

現在、コマンドラインはファイル全体...すべてのレコードを印刷しています。

予想される結果は次のとおりです。

2016-05-31 09:54:36 (16667) heritage_w?
  From: ip68-8-49-100.sd.sd.cox.net
  User: user1wizard (wizard)
  Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
  Referer: http://dbase.apollo3.com/heritage_w?i=290
  #accesses 3,435 (#welcome 415) since 03/07/2012
2016-05-31 09:54:41 (16677) heritage_w?w=
  From: ip68-8-49-100.sd.sd.cox.net
  User: user1wizard (wizard)
  Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
  Referer: http://dbase.apollo3.com/heritage_w?
  #accesses 3,436 (#welcome 416) since 03/07/2012

この問題の具体的な内容を明確にしてください。

私は答えを受け入れた。ジョン1024これにより、私に必要な記録を選択できます。しかし、誰かが特定の正規表現関数をレコード区切り文字(RS)変数として使用する方法を最終的に理解できることを願っています。この場合、インデントされていない行になります。

John1024の説明に従って、使用中の文字列を取得し、白ではなく正規表現をさまざまな組み合わせで使用しましたが、機能しません。

レコードを正しくフィルタリングしない私が使用する行は次のとおりです。

$ gawk 'BEGIN{RS='\n\S'}; /user1/ {print}' event.log
$ gawk 'BEGIN{RS='\S'}; /user1/ {print}' event.log
$ gawk 'BEGIN{RS="\n^\S"}; /user1/ {print}' event.log
$ gawk 'BEGIN{RS="^\S"}; /user1/ {print}' event.log

上記のすべての組み合わせはすべての履歴を表示します。一重引用符は、'^\S'エスケープされた意味ではなく実際の文字を使用していると確信しています。二重引用符に"^\S"エラーメッセージが表示されました。

gawk: cmd. line:1: warning: escape sequence `\S' treated as plain `S'

「\S」正規表現が白ではなく最初の列文字であることを確認できました。オンラインでインデントされていない行を表示します。

$ egrep "^\S" event.log

上記のcliの出力:

2016-05-31 09:54:36 (16667) heritage_w?
2016-05-31 09:54:41 (16677) heritage_w?w=
2016-06-01 04:07:06 (22190) heritage_w?m=MOD_IND;i=88
2016-06-01 04:07:38 (22255) heritage_w?m=MOD_FAM;i=28;ip=88

許可された回答の助けを借りて...コードをラップし、二重バックスラッシュを使用してエスケープ文字エラーを解決すると、次は必須レコードをフィルタリングします。

$ gawk 'BEGIN{RS="\n\\S"}; /user1/ {print}' event.log

ベストアンサー1

努力する:

$ gawk 'BEGIN{RS="\n2016"}; /user1/ {print}' input

これにより出力が生成されます。

2016-05-31 09:54:36 (16667) heritage_w?
  From: ip68-8-49-100.sd.sd.cox.net
  User: user1wizard (wizard)
  Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
  Referer: http://dbase.apollo3.com/heritage_w?i=290
  #accesses 3,435 (#welcome 415) since 03/07/2012
-05-31 09:54:41 (16677) heritage_w?w=
  From: ip68-8-49-100.sd.sd.cox.net
  User: user1wizard (wizard)
  Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
  Referer: http://dbase.apollo3.com/heritage_w?
  #accesses 3,436 (#welcome 416) since 03/07/2012

2番目のレコードにはソースがありません2016。それは。もちろん、それが2016レコード区切り文字の一部になるからです。記録処理を開始する前にこのセクションを復元するには、次のようにします。

gawk 'BEGIN{RS="\n2016"} NR>1{$0="2016" $0;} /user1/ {print}' input

改善する

このバージョンでは、必要に応じて各行の先頭にテキストを復元します。

gawk '{$0=substr(last,2)$0;} /user1/{print} {last=RT}' RS='\n[^[:space:]]' input

仕組み:

  • {$0=substr(last,2)$0;}$0レコード区切り文字で削除されたテキストの前に追加されます。substr前の改行文字を削除するために使用されます。

  • /user1/{print}興味のあるレコードを印刷してください。

  • {last=RT}実際のレコード区切り文字を保存して、その一部が次のレコードの前に追加されるようにします。 RTこれはGNU拡張であり、他のバージョンのawkではサポートされていません。

  • RS='\n[^[:space:]]'レコード区切り文字を改行文字に設定し、その後に空白以外の文字が続きます。正規表現をレコード区切り文字として使用することは、GNU awkで機能します。

例:

$ gawk '{$0=substr(last,2)$0;} /user1/{print} {last=RT}' RS='\n[^[:space:]]' input
2016-05-31 09:54:36 (16667) heritage_w?
  From: ip68-8-49-100.sd.sd.cox.net
  User: user1wizard (wizard)
  Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
  Referer: http://dbase.apollo3.com/heritage_w?i=290
  #accesses 3,435 (#welcome 415) since 03/07/2012
2016-05-31 09:54:41 (16677) heritage_w?w=
  From: ip68-8-49-100.sd.sd.cox.net
  User: user1wizard (wizard)
  Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
  Referer: http://dbase.apollo3.com/heritage_w?
  #accesses 3,436 (#welcome 416) since 03/07/2012

おすすめ記事