Bash 脚本帮助 - 文本解析和输出

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 列的第二行作为新行。

编辑:

输出是从多个设备获得的,这些设备存储在一个变量中,我从中查找有问题的设备。

答案1

这里需要多行 grep。为此,我们需要启用 PCRE-P 选项。由于 grep 将在 slurp-z模式下输出 Null 分隔记录,因此我们通过 tr 命令删除这些记录。

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

答案2

grep表现得像默认模式下应该的那样。从它的man页面:

...grep 在每个文件中搜索模式。 PATTERNS 是一个或多个由换行符分隔的模式,grep 打印与模式匹配的每一行...

所以,它应该出现线在匹配 a 的文本中regex。线条由控制代码划分newline,这解释了您所看到的行为。除了使用-z回复中提到的选项之外。假设“issue”是您想要匹配的正则表达式(如果您实际上想要匹配,请替换为'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 的手册页以了解有关这些选项的更多信息。

答案3

假设输入文件中的“记录”与OP提供的完全相同:

$ sed '/issue/!d; :a; n; /^[0-9]\{1,\} /d; $!ba' file
1  ok device issue   Some Action which 
                     has to be taken which 
                     is split into many lines
                     under d.
$

答案4

这可能就是您想要的,在每个 UNIX 机器上的任何 shell 中使用任何 awk:

$ cat tst.awk
/^[0-9]/ { prt() }
{ rec = rec $0 ORS }
END { prt() }

function prt() {
    if ( rec ~ regexp ) {
        printf "%s", rec
    }
    rec = ""
}

$ awk -v regexp='issue' -f tst.awk file
1  ok device issue   Some Action which
                     has to be taken which
                     is split into many lines
                     under d.

相关内容