特殊文字で始まるいくつかの行のマージ

特殊文字で始まるいくつかの行のマージ

次のログがあります。

2023-11-15T08:59:28.000000+00:00 database-1 # Time: 231115  8:59:28
# User@Host: rdsadmin[rdsadmin] @ localhost []
# Thread_id: 3  Schema:   QC_hit: No
# Query_time: 0.000123  Lock_time: 0.000000  Rows_sent: 1  Rows_examined: 0
# Rows_affected: 0  Bytes_sent: 49
SET timestamp=1700038768;
SET STATEMENT max_statement_time=60 FOR SELECT 1;

#次のように、文字で始まるいくつかの行を1行にマージするのに役立ちますか?

2023-11-15T08:59:28.000000+00:00 database-1 # Time: 231115  8:59:28# User@Host: rdsadmin[rdsadmin] @ localhost []# Thread_id: 3  Schema:   QC_hit: No# Query_time: 0.000123  Lock_time: 0.000000  Rows_sent: 1  Rows_examined: 0# Rows_affected: 0  Bytes_sent: 49
SET timestamp=1700038768;
SET STATEMENT max_statement_time=60 FOR SELECT 1;

tailを使用しておりawscli、aws rdsのデフォルトログを表示したいと思います。

このコマンドを試しましたが動作しません

aws logs tail /aws/rds/instance/database-1/slowquery --log-stream-names database-1 --follow |  sed ':a;N;$!ba;s/\n\#/ #/g'

答え1

使用awk:

$ awk '
  {
    printf "%s", ((/^#/ || NR==1) ? "" : ORS )$0
  }
  END {
    if (NR) print ""
  }'

答え2

awkを使用してください。

$ awk '
    /^#/ { rec = rec OFS $0; next }
    NR>1 { print rec }
    { rec = $0 }
    END { print rec }
' file
2023-11-15T08:59:28.000000+00:00 database-1 # Time: 231115  8:59:28 # User@Host: rdsadmin[rdsadmin] @ localhost [] # Thread_id: 3  Schema:   QC_hit: No # Query_time: 0.000123  Lock_time: 0.000000  Rows_sent: 1  Rows_examined: 0 # Rows_affected: 0  Bytes_sent: 49
SET timestamp=1700038768;
SET STATEMENT max_statement_time=60 FOR SELECT 1;

上記のように、複数行のレコードを1行ずつ作成して保存し、次のrecレコードの開始時に印刷します。これにより、印刷する前にレコードに対して何かをする必要がある場合recrec

awk '
    /^#/ { rec = rec RS $0; next }
    NR>1 { prt() }
    { rec = $0 }
    END { prt() }
    function prt() { gsub(RS,OFS,rec); print rec }
' file
2023-11-15T08:59:28.000000+00:00 database-1 # Time: 231115  8:59:28 # User@Host: rdsadmin[rdsadmin] @ localhost [] # Thread_id: 3  Schema:   QC_hit: No # Query_time: 0.000123  Lock_time: 0.000000  Rows_sent: 1  Rows_examined: 0 # Rows_affected: 0  Bytes_sent: 49
SET timestamp=1700038768;
SET STATEMENT max_statement_time=60 FOR SELECT 1;

prt()その後、その関数内で構成された個々の行に関するすべての情報を取得できます。rec

答え3

ed次のコマンドを使用して、#文字で始まるすべての行を前の行に関連付けます。

g/^#/ -,. j

-,. jこのコマンドが行うことは、正規表現に一致するすべての行にコマンドを適用することです^#。このjコマンドは、前の行(-)と現在の行(.)を連結します。

,pバッファ全体を印刷して終了するには、追加してくださいQ

$ printf '%s\n' 'g/^#/ -,. j' ,p Q | ed -s file
2023-11-15T08:59:28.000000+00:00 database-1 # Time: 231115  8:59:28# User@Host: rdsadmin[rdsadmin] @ localhost []# Thread_id: 3  Schema:   QC_hit: No# Query_time: 0.000123  Lock_time: 0.000000  Rows_sent: 1  Rows_examined: 0# Rows_affected: 0  Bytes_sent: 49
SET timestamp=1700038768;
SET STATEMENT max_statement_time=60 FOR SELECT 1;

2 つのコマンド,psum をQ1 つのコマンドに変更するwqか、それぞれを sum にw変更し、q編集したバッファを元のファイルに書き換えて終了します。

答え4

aws logs tail /aws/rds/instance/database-1/slowquery --log-stream-names database-1 --follow | sed ':a;N;$!ba;s/\n#/#/g'

関連情報