次のログがあります。
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
レコードの開始時に印刷します。これにより、印刷する前にレコードに対して何かをする必要がある場合rec
。rec
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 つのコマンド,p
sum をQ
1 つのコマンドに変更する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'