Shell-Script

Bash 腳本幫助 - 文本解析和輸出

  • August 18, 2020

我有以下類型的文本文件,

a  b   c               d
-- -- --              --
1  ok device issue   Some Action which 
                    has to be taken which 
                    is split into many lines
                    under d.

我曾嘗試將 grep 用於“問題”,但是只列印了“d”的第一行。我得到的輸出是:

1  ok device issue   Some Action which 

但是我想要 d 中的完整輸出。當我嘗試將文件保存在 csv 中時,它將 d 列的第二行顯示為新行。

編輯:

輸出是從多個設備中獲得的,這些設備儲存在一個變數中,我從中尋找有問題的設備。

grep在預設模式下表現得像它應該的那樣。從它的man頁面:

…grep 在每個 FILE 中搜尋 PATTERNS。PATTERNS 是由換行符分隔的一個或多個模式,grep 列印與模式匹配的每一行…

因此,它應該在匹配 a 的文本中出現regex。行由newline控制程式碼劃分,這解釋了您所看到的行為。除了使用-z回復中提到的選項。假設“問題”是您想要匹配的正則表達式(替換為'Device Degraded'or'\sDegraded'或者'\sError'如果這是您實際想要匹配的內容);並且“糾正措施”列是機器生成的並且是一致的,即始終跨越 4 行,您也可以簡單地執行grep -A 3 '\sissue' > issues僅將您感興趣的行保存到文件中。您必須能夠生成如下所示的輸出:

1  ok device issue  Some Action which 
                       has to be taken which 
                       is split into many lines 
                       under d.
--
10  ok device issue Some Action which
           has to be taken which 
           is split into may lines
           under d. 
--
211 ok device issue Some Action which
           has to be taken which 
           is split into many lines 
           under d.

查看 grep 的手冊頁以了解有關這些選項的作用的更多資訊。

您需要在這裡進行多行 grepping。為此,我們需要啟用 PCRE-P 選項。由於 grep 將在 slurp-z模式下輸出 Null 分隔記錄,我們通過 tr 命令刪除這些記錄。

$ < file grep -Pzo '.*\S.*issue.*\n(?:\h+.*\n)+'  | tr -d '\0'

引用自:https://unix.stackexchange.com/questions/604245