다음과 같은 로그가 있습니다.
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;
#
다음과 같이 문자로 시작하는 일부 줄을 한 줄로 병합하는 데 도움을 주실 수 있나요 ?
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;
위와 같이 여러 행의 레코드를 한 줄씩 작성 및 저장 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;
두 명령 ,p
sum을 Q
단일 명령으로 변경 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'