텍스트 파일에서 한 줄의 처음 25자가 공백인 경우 첫 번째 열에 ASCII 문자로 시작하는 다른 줄이 있을 때까지 해당 줄을 이전 줄에 어떻게 추가합니까? 여기서는 볼 수 없어서 스크린샷을 추가했습니다. 원본 파일에서는 먼저 각 줄의 뒤에 오는 공백을 제거해야 합니다. 이것은 작동하지만 나머지를 구현하는 방법을 모르겠습니다. 나는 모든 것을 스크립트로 갖는 것을 선호합니다(Perl이나 이와 유사한 것이 아님).
원본 파일:
08/07/2023 09:02:07 ANR8592T Session 137576 connection is using protocol
TLSVI3, cipher specification TLS_AES_256_GCM_SHA384,
certificate TSM Self-Signed Certificate. (SESSION:
137576)
08/07/2023 09:02:07 ANR@B4OT Session 137576 started for administrator ADMIN
(WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]-
:65234) on MU-SV-SPS1.de.bertrandt.net:1500. (SESSTON:
137576)
08/07/2023 09:02:07 ANR2017T Administrator ADMIN issued command: select
status from processes where process="NAS SnapMirror
Backup’ and status like 'WMU-SV-CL2%' (SESSION: 137576)
08/07/2023 09:02:07 ANR@46ST Session 137576 ended for administrator ADMIN
(WinNT). (SESSION: 137576)
08/07/2023 09:02:38 ANR8592T Session 137577 connection is using protocol
TLSVI3, cipher specification TLS_AES_256_GCM_SHA384,
certificate TSM Self-Signed Certificate. (SESSION:
137577)
08/07/2023 09:02:38 ANR@B4OT Session 137577 started for administrator ADMIN
(WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]-
:65235) on MU-SV-SPS1.de.bertrandt.net:1560. (SESSTON:
137577)
08/07/2023 09:02:38 ANR2017T Administrator ADMIN issued command: select
node_name, filespace_name, BACKUP_START, BACKUP_END,
CAPACITY, PCT_UTIL from filespaces where node_name like
“MU-SV-CL2%" (SESSION: 137577)
08/07/2023 09:02:38 ANR@46ST Session 137577 ended for administrator ADMIN
(WinNT). (SESSION: 137577)
08/07/2023 09:02:38 ANR8592T Session 137578 connection is using protocol
TLSVI3, cipher specification TLS_AES_256_GCM_SHA384,
certificate TSM Self-Signed Certificate. (SESSION:
137578)
08/07/2023 09:02:38 ANR@B4OT Session 137578 started for administrator ADMIN
(WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]-
:65236) on MU-SV-SPS1.de.bertrandt.net:1560. (SESSTON:
137578)
요청된 결과:
08/07/2023 09:02:07 ANR8592T Session 137576 connection is using protocol TLSVI3, cipher specification TLS_AES_256_GCM_SHA384, certificate TSM Self-Signed Certificate. (SESSION: 137576)
08/07/2023 09:02:07 ANR@B4OT Session 137576 started for administrator ADMIN (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]- :65234) on MU-SV-SPS1.de.bertrandt.net:1500. (SESSTON: 137576)
08/07/2023 09:02:07 ANR2017T Administrator ADMIN issued command: select status from processes where process="NAS SnapMirror Backup’ and status like 'WMU-SV-CL2%' (SESSION: 137576) 08/07/2023 09:02:07 ANR@46ST Session 137576 ended for administrator ADMIN (WinNT). (SESSION: 137576)
08/07/2023 09:02:38 ANR8592T Session 137577 connection is using protocol TLSVI3, cipher specification TLS_AES_256_GCM_SHA384, certificate TSM Self-Signed Certificate. (SESSION: 137577)
08/07/2023 09:02:38 ANR@B4OT Session 137577 started for administrator ADMIN (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]- :65235) on MU-SV-SPS1.de.bertrandt.net:1560. (SESSTON: 137577)
08/07/2023 09:02:38 ANR2017T Administrator ADMIN issued command: select node_name, filespace_name, BACKUP_START, BACKUP_END, CAPACITY, PCT_UTIL from filespaces where node_name like “MU-SV-CL2%" (SESSION: 137577)
08/07/2023 09:02:38 ANR@46ST Session 137577 ended for administrator ADMIN (WinNT). (SESSION: 137577)
08/07/2023 09:02:38 ANR8592T Session 137578 connection is using protocol TLSVI3, cipher specification TLS_AES_256_GCM_SHA384, certificate TSM Self-Signed Certificate. (SESSION: 137578)
08/07/2023 09:02:38 ANR@B4OT Session 137578 started for administrator ADMIN (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]- :65236) on MU-SV-SPS1.de.bertrandt.net:1560. (SESSTON: 137578)
답변1
sed
이 답변 끝에 있는 솔루션을 사용하세요 .
편집기를 사용하여 ed
먼저 줄 시작 부분의 모든 공백(탭 또는 공백)을 단일 공백으로 바꾼 다음 공백으로 시작하는 각 줄을 이전 줄과 연결합니다.
printf '%s\n' 'g/^[[:blank:]]\{1,\}/ s// /' 'g/^ / -,.j' ,p Q | ed -s file
결과 문서는 표준 출력 스트림으로 인쇄되지만 원본 파일에 다시 기록되도록 ,p
변경할 수 있습니다.w
이 편집 세션의 두 가지 주요 명령은 다음과 같습니다.
g/^[[:blank:]]\{1,\}/ s// /
이렇게 하면 줄의 시작 부분에서 하나 이상의 공백이 모두 제거되고 단일 공백으로 대체됩니다.g/^ / -,.j
이렇게 하면 공백으로 시작하는 각 줄이 바로 앞 줄에 연결됩니다.
이 두 명령을 및 명령을 모두 실행하는 g
하나의 명령으로 결합합니다 .g
s
j
printf '%s\n' 'g/^[[:blank:]]\{1,\}/ s// /\' '-,.j' ,p Q | ed -s file
다음 샘플 입력으로 테스트하세요.
XXX XXX XXX YYY YYY YYY YYY YYY
ZZZ ZZZ ZZZ ZZZ ZZZ
YYY ZZZ YYY ZZZ YYY
YYY ZZZ YYY ZZZ YYY
YYY ZZZ YYY ZZZ YYY
XXX XXX XXX YYY YYY YYY YYY YYY
ZZZ ZZZ ZZZ ZZZ ZZZ
YYY ZZZ YYY ZZZ YYY
XXX XXX XXX YYY YYY YYY YYY YYY
ZZZ ZZZ ZZZ ZZZ ZZZ
YYY ZZZ YYY ZZZ YYY
YYY ZZZ YYY ZZZ YYY
YYY ZZZ YYY ZZZ YYY
결과:
XXX XXX XXX YYY YYY YYY YYY YYY ZZZ ZZZ ZZZ ZZZ ZZZ YYY ZZZ YYY ZZZ YYY YYY ZZZ YYY ZZZ YYY YYY ZZZ YYY ZZZ YYY
XXX XXX XXX YYY YYY YYY YYY YYY ZZZ ZZZ ZZZ ZZZ ZZZ YYY ZZZ YYY ZZZ YYY
XXX XXX XXX YYY YYY YYY YYY YYY ZZZ ZZZ ZZZ ZZZ ZZZ YYY ZZZ YYY ZZZ YYY YYY ZZZ YYY ZZZ YYY YYY ZZZ YYY ZZZ YYY
공백이나 탭으로 줄을 들여쓰는지 여부는 중요하지 않습니다. 또한 각 "섹션"의 첫 번째 비트( XXX...
예제에서는 비트)와 나머지 부분(공백 또는 탭 사용 여부) 사이의 간격은 변경되지 않습니다.
그리고 sed
:
sed -e '/^[[:blank:]]\{1,\}/ { s///; H; $!d; }' -e 'x; y/\n/ /' file
이는 하나 이상의 초기 공백이 있는 행을 감지하고 해당 공백을 제거한 후 해당 행을 예약된 공간( sed
사이클 사이에 지워지지 않는 보조 버퍼)에 추가합니다. 해당 줄이 마지막 줄이 아니면 해당 줄은 삭제되고 스크립트는 다음 입력 줄로 이동합니다.
다른 줄(및 공백으로 시작하는 문서의 마지막 줄)의 경우 버퍼는 보존된 공백으로 교체되고 H
결과가 출력되기 전에 모든 줄 바꿈(명령에 의해 구분 기호로 삽입됨)은 공백으로 대체됩니다.
이는 위의 파이프라인과 동일한 출력을 생성 ed
하지만 공백으로 시작하지 않으면 입력의 마지막 줄을 처리할 수 없습니다(가능한 한 예제 텍스트에서는 그렇지 않습니다). 이미지를 통해 알 수 있습니다.)
답변2
이상한 솔루션
스크립트 format_text.awk
:
#! /usr/bin/awk -f
/^[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]/ {
if (line) {
print line
}
line = $0
next
}
{
gsub(/^[ \t]+/, "")
line = line " " $0
}
END {
if (line) {
print line
}
}
그리고:
chmod +x format_text.awk
다음과 같이 실행하세요:
./format_text.awk log.txt
답변3
POSIX awk를 사용하십시오.
$ awk -F'^[[:space:]]+' '
NF==1 { if (NR>1) print rec; rec=$0; next }
{ rec = rec OFS $2 }
END { print rec }
' file
08/07/2023 09:02:07 ANR8592T Session 137576 connection is using protocol TLSVI3, cipher specification TLS_AES_256_GCM_SHA384, certificate TSM Self-Signed Certificate. (SESSION: 137576)
08/07/2023 09:02:07 ANR@B4OT Session 137576 started for administrator ADMIN (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]- :65234) on MU-SV-SPS1.de.bertrandt.net:1500. (SESSTON: 137576)
08/07/2023 09:02:07 ANR2017T Administrator ADMIN issued command: select status from processes where process="NAS SnapMirror Backup’ and status like 'WMU-SV-CL2%' (SESSION: 137576) 08/07/2023 09:02:07 ANR@46ST Session 137576 ended for administrator ADMIN (WinNT). (SESSION: 137576)
08/07/2023 09:02:38 ANR8592T Session 137577 connection is using protocol TLSVI3, cipher specification TLS_AES_256_GCM_SHA384, certificate TSM Self-Signed Certificate. (SESSION: 137577)
08/07/2023 09:02:38 ANR@B4OT Session 137577 started for administrator ADMIN (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]- :65235) on MU-SV-SPS1.de.bertrandt.net:1560. (SESSTON: 137577)
08/07/2023 09:02:38 ANR2017T Administrator ADMIN issued command: select node_name, filespace_name, BACKUP_START, BACKUP_END, CAPACITY, PCT_UTIL from filespaces where node_name like “MU-SV-CL2%" (SESSION: 137577)
08/07/2023 09:02:38 ANR@46ST Session 137577 ended for administrator ADMIN (WinNT). (SESSION: 137577)
08/07/2023 09:02:38 ANR8592T Session 137578 connection is using protocol TLSVI3, cipher specification TLS_AES_256_GCM_SHA384, certificate TSM Self-Signed Certificate. (SESSION: 137578)
08/07/2023 09:02:38 ANR@B4OT Session 137578 started for administrator ADMIN (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]- :65236) on MU-SV-SPS1.de.bertrandt.net:1560. (SESSTON: 137578)
답변4
이것은 한 줄 솔루션입니다.sed
sed -E -z 's/\n([ ]{25})//g' ./input.txt > ./output.txt
-E
정규식을 사용하도록 지정합니다.-z
\n
문자 일치s/\n([ ]{25})//g
s/
바꾸다\n([ ]{25})/
줄바꿈 뒤에 25개의 공백이 오는 것을 아무것도 없는 것으로 바꿉니다./g
콘텐츠에 대해 전역적으로 작업 수행