我有一些数据,其中第四列是frz
或-
。我想找到frz
只有下一行的第四列是第四列的所有行-
,然后打印这两行。
输入示例:
2018-04-09T14:15:23.366Z 7 multi - uuid1 uuid2 uuid3 -
2018-04-09T14:15:23.978Z 8 multi frz uuid1 uuid3 - -
2018-04-09T14:29:35.826Z 8 multi frz uuid1 uuid3 uuid2 -
2018-04-09T17:19:01.901Z 8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z 8 multi - uuid1 uuid3 uuid2 -
2018-06-28T00:35:54.338Z 9 multi - uuid1 uuid2 - -
2018-06-28T00:47:51.679Z 9 multi - uuid1 uuid2 uuid3 -
2018-06-28T00:47:51.720Z 10 multi - uuid1 uuid3 - -
2018-06-28T00:47:58.863Z 10 multi - uuid1 uuid3 uuid2 -
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -
预期输出:
2018-04-09T17:19:01.901Z 8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z 8 multi - uuid1 uuid3 uuid2 -
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -
我找到了一些awk
在匹配后打印该行的命令,但我不知道如何匹配这两行并打印两者。
我目前拥有的:
$ awk 'f{print;f=0} $4=="frz"{f=1}' input
2018-04-09T14:29:35.826Z 8 multi frz uuid1 uuid3 uuid2 -
2018-04-09T17:19:01.901Z 8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z 8 multi - uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -
答案1
怎么样:
awk '$4=="-" && prev4=="frz" {print prevline; print} {prev4 = $4; prevline=$0}' file
答案2
如果您有 GNU grep 并且您的模式没有出现在数据的其他位置,您可以尝试以下操作:
grep -A1 frz | grep -vB1 frz
解释
第一个grep
捕获出现模式的所有行,加上下一个:
-A NUM, --after-context=NUM 在匹配行之后打印 NUM 行尾随上下文。在连续的匹配组之间放置一条包含组分隔符 (--) 的行。
示例输入上的第一个命令的输出是:
2018-04-09T14:15:23.978Z 8 multi frz uuid1 uuid3 - -
2018-04-09T14:29:35.826Z 8 multi frz uuid1 uuid3 uuid2 -
2018-04-09T17:19:01.901Z 8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z 8 multi - uuid1 uuid3 uuid2 -
--
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -
然后第二个命令搜索行不是包含模式,并用之前的行打印它们:
-B NUM, --before-context=NUM 在匹配行之前打印 NUM 行前导上下文。在连续的匹配组之间放置一条包含组分隔符 (--) 的行。
如中所述grep 手册页,输出包含组分隔符 ( --
) :
2018-04-09T17:19:01.901Z 8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z 8 multi - uuid1 uuid3 uuid2 -
--
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -
grep
如果需要,您可以添加第三个来删除它们:
grep -A1 frz | grep -vB1 frz | grep -v '^--$'
答案3
我想提供一种完全不切实际的 GNUgrep
方法。有效,但看起来很糟糕。
grep -Pzo "^\S+\s+\S+\s+\S+\s+frz\s+.*\n\S+\s+\S+\s\S+\s+\-\s+.*" input
例子。
$ cat file
2018-04-09T14:15:23.366Z 7 multi - uuid1 uuid2 uuid3 -
2018-04-09T14:15:23.978Z 8 multi frz uuid1 uuid3 - -
2018-04-09T14:29:35.826Z 8 multi frz uuid1 uuid3 uuid2 -
2018-04-09T17:19:01.901Z 8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z 8 multi - uuid1 uuid3 uuid2 -
2018-06-28T00:35:54.338Z 9 multi - uuid1 uuid2 - -
2018-06-28T00:47:51.679Z 9 multi - uuid1 uuid2 uuid3 -
2018-06-28T00:47:51.720Z 10 multi - uuid1 uuid3 - -
2018-06-28T00:47:58.863Z 10 multi - uuid1 uuid3 uuid2 -
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -
$ grep -Pzo "^\S+\s+\S+\s+\S+\s+frz\s+.*\n\S+\s+\S+\s\S+\s+\-\s+.*" file
2018-04-09T17:19:01.901Z 8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z 8 multi - uuid1 uuid3 uuid2 -
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -
$ grep -V 2>&1|head -1
grep (GNU grep) 2.20
$
答案4
你也可以尝试这个 sed
sed -E '
/([^ ]* *){3}frz .*/!d
$!N
/(.*\n)([^ ]* *){3}- .*/!D
' infile