業務爸爸:小毛驢我有個歷史交易記錄數據,以ID開頭(如ID Apple450001315857834)到 TIME結束(如TIME 1673615211)表示一條完整的記錄,其中中間有RFTIME行(如RFTIME 1673696951)表示交易正常,反正是交易異?!,F在需要把交易異常的記錄拿出來。數據如下:
root@VM-2-15-ubuntu:~# cat list.txt
ID apple450001315857834
PR 25
RFTIME 1673696951
SAVEID xmlCAtgyXH
TIME 1673615211
ID apple450001216057835
PR 25
SAVEID xmlCAtgyXH
TIME 1663042017
ID apple450001315857834
PR 25
RFTIME 1673696951
SAVEID xmlCAtgyXH
TIME 1673615211
ID apple450001216057835
PR 25
SAVEID xmlCAtgyXH
TIME 1663042017
ID apple450001315857834
PR 25
RFTIME 1673696951
SAVEID xmlCAtgyXH
TIME 1673615211
ID apple450001216057835
PR 25
SAVEID xmlCAtgyXH
TIME 1663042017
ID apple450001315857834
PR 25
RFTIME 1673696951
SAVEID xmlCAtgyXH
TIME 1673615211
ID apple450001315857834
PR 25
RFTIME 1673696951
SAVEID xmlCAtgyXH
TIME 1673615211
ID apple450001315857834
PR 25
RFTIME 1673696951
SAVEID xmlCAtgyXH
TIME 1673615211
ID apple450001315857834
PR 25
RFTIME 1673696951
SAVEID xmlCAtgyXH
TIME 1673615211
ID apple450001216057835
PR 25
SAVEID xmlCAtgyXH
TIME 1663042017
小毛驢:安排!
拿到這個需求,小毛驢第一就想到了用sed多行處理,而且也洋洋灑灑的寫出來第一個版本:
sed -nr ':a;N;/TIME/!ba;/RFTIME/!p;' list.txt
root@VM-2-15-ubuntu:~# sed -nr ':a;N;/TIME/!ba;/RFTIME/!p;' list.txt
SAVEID xmlCAtgyXH
TIME 1673615211
ID apple450001216057835
PR 25
SAVEID xmlCAtgyXH
TIME 1663042017
SAVEID xmlCAtgyXH
TIME 1673615211
ID apple450001216057835
PR 25
SAVEID xmlCAtgyXH
TIME 1663042017
SAVEID xmlCAtgyXH
TIME 1673615211
ID apple450001216057835
PR 25
SAVEID xmlCAtgyXH
TIME 1663042017
SAVEID xmlCAtgyXH
TIME 1673615211
SAVEID xmlCAtgyXH
TIME 1673615211
SAVEID xmlCAtgyXH
TIME 1673615211
SAVEID xmlCAtgyXH
TIME 1673615211
ID apple450001216057835
PR 25
SAVEID xmlCAtgyXH
TIME 1663042017
很明顯上面的不符合需求,這個時候,很明顯是數據錨定有問題, 此時我只能請出sed的debug工具---sedsed。
sedsed安裝
cd /usr/local/sbin
wget https://raw.Githubusercontent.com/aureliojargas/sedsed/main/sedsed.py
wget https://raw.githubusercontent.com/aureliojargas/sedparse/main/sedparse.py
mv sedsed.py sedsed
chmod +x sedsed
sed三個空間 如下圖。
PATT: sedsed輸出顯示模式空間緩沖區的內容
COMM: 顯示正在執行的命令
HOLD: 顯示hold sapce緩沖區的內容
sed一次處理一行內容,處理時,把當前處理的行存儲在臨時緩沖區中,稱為"模式空間"(pattern space);
接著用sed命令處理緩沖區(pattern space)中的內容,處理完成后,把緩沖區(pattern space)的內容送往屏幕.
接著清空緩沖區(pattern space),處理下一行,這樣不斷重復,直到文件末尾.
sed一次處理一行內容,處理時,先讀入一行,去掉尾部換行符,存入pattern space,執行編輯命令.
處理完畢,除非加了-n參數,把現在的pattern space打印出來,在后邊打印曾去掉的換行符.
pattern space(模式空間)相當于sed車間把流內容在這里處理.
hold space(保留空間)相當于倉庫,加工的半成品在這里臨時儲存(當然加工完的成品也在這里存儲).
開始調試
PATT:ID apple450001315857834$ //模式空間 讀入第一行
HOLD:$ // 此時hold sapce為空
COMM::a // 執行條件選擇a
COMM:N // 追加讀一行數據
PATT:ID apple450001315857834nPR 25$ // 模式空間此時內容
HOLD:$ // 此時hold sapce為空
COMM:/TIME/ !b a //執行條件選擇a,不滿足,繼續讀取下一行
COMM:N
PATT:ID apple450001315857834nPR 25nRFTIME 1673696951$ // 模式空間此時內容
HOLD:$ // 此時hold sapce為空
COMM:/TIME/ !b a //執行條件選擇a,滿足了---竟然滿足了。問題就出現在這了。
COMM:/RFTIME/ !p // 滿足就不打印
PATT:ID apple450001315857834nPR 25nRFTIME 1673696951$ // 模式空間此時內容將會被清空
HOLD:$
PATT:SAVEID xmlCAtgyXH$ // 模式空間讀入一個新行
HOLD:$
COMM::a
COMM:N
PATT:SAVEID xmlCAtgyXHnTIME 1673615211$
HOLD:$
COMM:/TIME/ !b a
通過上面debug我們可以看出是因為RFTIME匹配到TIME,這個真是不細心的的原因。 改(嘗試了30多分鐘,才用debug工具看出來,真是xx。)
root@VM-2-15-ubuntu:~# sed -nr ':a;N;/bTIME/!ba;/RFTIME/!p;' list.txt
ID apple450001216057835
PR 25
SAVEID xmlCAtgyXH
TIME 1663042017
ID apple450001216057835
PR 25
SAVEID xmlCAtgyXH
TIME 1663042017
ID apple450001216057835
PR 25
SAVEID xmlCAtgyXH
TIME 1663042017
ID apple450001216057835
PR 25
SAVEID xmlCAtgyXH
TIME 1663042017