특수 문자로 시작하는 일부 줄 병합

특수 문자로 시작하는 일부 줄 병합

다음과 같은 로그가 있습니다.

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;

두 명령 ,psum을 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'

관련 정보