Shell-Script
Bash 腳本幫助 - 文本解析和輸出
我有以下類型的文本文件,
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'