我有一些数据,其中第 4 列将是frz
或-
。我想找到frz
只有下一行的第4 列是第 4 列的所有行-
,然后打印这两行。
样本输入:
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 -
怎么样:
如果你有 GNU grep 并且你的模式没有出现在数据的其他地方,你可以试试这个:
解释
第一个
grep
捕获模式出现的所有行,加上下一个:您的示例输入的第一个命令的输出是:
然后第二个命令搜索不包含该模式的行,并将它们与之前的行一起打印:
如grep 手册页中所述,输出包含组分隔符 (
--
):如果需要,您可以添加第三个
grep
以删除它们:我想提供一种完全不切实际的 GNU
grep
方法。有效,但看起来很讨厌。例子。
你也可以试试这个 sed