グループ化されたログエントリを単一行に変換

グループ化されたログエントリを単一行に変換

次のログ(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

おすすめ記事