그룹화된 로그 항목을 단일 행으로 변환

그룹화된 로그 항목을 단일 행으로 변환

다음과 같은 로그(Unison 파일 동기화로 생성됨)가 있습니다.

UNISON 2.51.3 (OCAML 4.11.1) started propagating changes at 15:25:10.21 on 27 Feb 2023
[BGN] Copying TestFolder/01/TestFile01.pdf from //10.0.0.2//home/testsync to /home/testsync
[END] Copying TestFolder/01/TestFile01.pdf
[BGN] Copying TestFolder/01/TestFile02.pdf from //10.0.0.2//home/testsync to /home/testsync
[END] Copying TestFolder/01/TestFile02.pdf
[BGN] Copying TestFolder/01/TestFile03.xlsx from //10.0.0.2//home/testsync to /home/testsync
Shortcut: copied /home/testsync/TestFolder/01/TestFile03.xlsx from local file /home/testsync/TestFolder/02/TestFile03.xlsx
[END] Copying TestFolder/01/TestFile03.xlsx
[BGN] Updating file TestFolder/01/TestFile04.jpg from //10.0.0.2//home/testsync to /home/testsync
[END] Updating file TestFolder/01/TestFile04.jpg
[BGN] Deleting /home/testsync/TestFolder/02/TestFile03.xlsx from /home/testsync
UNISON 2.51.3 (OCAML 4.11.1) finished propagating changes at 15:25:46.24 on 27 Feb 2023

나는 이와 비슷한 것을 얻고 싶습니다 :

27 Feb 2023 15:25:10.21 Copying TestFolder/01/TestFile01.pdf from //10.0.0.2//home/testsync to /home/testsync
27 Feb 2023 15:25:10.21 Copying TestFolder/01/TestFile02.pdf from //10.0.0.2//home/testsync to /home/testsync
27 Feb 2023 15:25:10.21 Copying TestFolder/01/TestFile03.xlsx from //10.0.0.2//home/testsync to /home/testsync
27 Feb 2023 15:25:10.21 Shortcut: copied /home/testsync/TestFolder/01/TestFile03.xlsx from local file /home/testsync/TestFolder/02/TestFile03.xlsx
27 Feb 2023 15:25:10.21 Updating file TestFolder/01/TestFile04.jpg from //10.0.0.2//home/testsync to /home/testsync
27 Feb 2023 15:25:10.21 Deleting /home/testsync/TestFolder/02/TestFile03.xlsx from /home/testsync

즉, 행에 표시된 날짜와 시간을 기억 하고 행 앞의 모든 행을 started propagating changes다시 인쇄 해야 합니다.[BGN]Shortcutfinished propagating changes

Bash 스크립트에서 이 작업을 어떻게 수행합니까?

cat, 및 연결을 사용하여 grep몇 가지 테스트를 수행했지만 awk필요한 출력을 얻을 수 없습니다. 로그 형식이 Unison FileSynchronizer 프로그램의 기본 로그이기 때문에 Bash 스크립트를 사용해야 하지만 동기화에 의해 이루어진 모든 수정 사항을 추적하고 싶고 프로그램이 실행된 후에 이 작업을 수행해야 합니다.

내 문제를 해결해준 Ed Morton의 답변에 감사드립니다. 입력 로그에 여러 부분이 있을 수 있으므로 awk 구문을 약간만 수정했습니다(이 사실을 말하는 것을 잊어버렸습니다). 내 최종 AWK 구문은 다음과 같습니다.

sub(/.*started propagating changes at /,"") {
    mthNr = index("  JanFebMarAprMayJunJulAugSepOctNovDec",$4) / 3
    ts = sprintf("%04d-%02d-%02dT%s", $5, mthNr, $3, $1)
    next
}
sub(/^\[BGN] /,"") || /^Shortcut/ {
    print ts, $0
}

답변1

awk를 사용하십시오.

$ cat tst.awk
sub(/.*started propagating changes at /,"") {
    ts = $3 FS $4 FS $5 FS $1
    next
}
sub(/^\[BGN] /,"") || /^Shortcut/ {
    print ts, $0
}
/finished propagating/ {
    exit
}

$ awk -f tst.awk file
27 Feb 2023 15:25:10.21 Copying TestFolder/01/TestFile01.pdf from //10.0.0.2//home/testsync to /home/testsync
27 Feb 2023 15:25:10.21 Copying TestFolder/01/TestFile02.pdf from //10.0.0.2//home/testsync to /home/testsync
27 Feb 2023 15:25:10.21 Copying TestFolder/01/TestFile03.xlsx from //10.0.0.2//home/testsync to /home/testsync
27 Feb 2023 15:25:10.21 Shortcut: copied /home/testsync/TestFolder/01/TestFile03.xlsx from local file /home/testsync/TestFolder/02/TestFile03.xlsx
27 Feb 2023 15:25:10.21 Updating file TestFolder/01/TestFile04.jpg from //10.0.0.2//home/testsync to /home/testsync
27 Feb 2023 15:25:10.21 Deleting /home/testsync/TestFolder/02/TestFile03.xlsx from /home/testsync

타임스탬프를 정렬 가능하고 일반적으로 더 유용한 것으로 변경하는 것을 고려해보세요.ISO 8601그러나 (적절하게 시간대 정보를 추가하세요):

$ cat tst.awk
sub(/.*started propagating changes at /,"") {
    mthNr = index("  JanFebMarAprMayJunJulAugSepOctNovDec",$4) / 3
    ts = sprintf("%04d-%02d-%02dT%s", $5, mthNr, $3, $1)
    next
}
sub(/^\[BGN] /,"") || /^Shortcut/ {
    print ts, $0
}
/finished propagating/ {
    exit
}

$ awk -f tst.awk file
2023-02-27T15:25:10.21 Copying TestFolder/01/TestFile01.pdf from //10.0.0.2//home/testsync to /home/testsync
2023-02-27T15:25:10.21 Copying TestFolder/01/TestFile02.pdf from //10.0.0.2//home/testsync to /home/testsync
2023-02-27T15:25:10.21 Copying TestFolder/01/TestFile03.xlsx from //10.0.0.2//home/testsync to /home/testsync
2023-02-27T15:25:10.21 Shortcut: copied /home/testsync/TestFolder/01/TestFile03.xlsx from local file /home/testsync/TestFolder/02/TestFile03.xlsx
2023-02-27T15:25:10.21 Updating file TestFolder/01/TestFile04.jpg from //10.0.0.2//home/testsync to /home/testsync
2023-02-27T15:25:10.21 Deleting /home/testsync/TestFolder/02/TestFile03.xlsx from /home/testsync

관련 정보