我有以下类型的文本文件,
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.