sed在以模式开头的行之前删除行,如果找不到模式,则不执行任何操作

sed在以模式开头的行之前删除行,如果找不到模式,则不执行任何操作,sed,Sed,我想使用sed缩短包含以日期开头的行的日志: 2017-07-26T01:01:01 236 2017-07-27T01:02:01 236 2017-07-27T01:02:51 236 2017-07-27T01:03:01 236 2017-07-28T01:01:01 236 2017-09-07T09:05:18 236 2017-09-07T10:22:10 239 (不,logrotate不行)。我知道我可以用 sed -i '0,/^2017-07-27/d' filename

我想使用sed缩短包含以日期开头的行的日志:

2017-07-26T01:01:01 236
2017-07-27T01:02:01 236
2017-07-27T01:02:51 236
2017-07-27T01:03:01 236
2017-07-28T01:01:01 236
2017-09-07T09:05:18 236
2017-09-07T10:22:10 239
(不,logrotate不行)。我知道我可以用

sed -i '0,/^2017-07-27/d' filename
删除第一行之前的所有行(在适当位置),上面有“2017-07-27”和第一行,但如果文件不包含该行,或仅包含一行,sed将删除所有内容。如果找不到图案,我什么也不想做

我还想就地删除

如果模式不匹配,如何防止sed删除所有行? 有没有更好的方法可以做到这一点呢?

永远不要说永远

我们可以使用sed保持空间来收集所需的输出。如果我们将第一行与日期匹配,我们将丢弃保留空间中累积的内容,并重新开始将行收集到保留空间中。在文件末尾,我们打印出保留空间的内容

整个文件可能会在保留空间中结束。我想我们可以开始直接打印每一行,而不是在找到匹配项后累积到保留空间。。。大概但是如果没有匹配项,我们仍然必须在保留空间中累积整个文件,因为最后一行可能会有匹配项,我们必须扔掉所有内容。但我很高兴这样

我稍微修改了示例输入,以便在开发sed脚本时更容易看到哪行是哪行

bjb@rhino:~$ cat /tmp/sed.txt
2017-07-26T01:01:01 231
2017-07-27T01:02:01 232
2017-07-27T01:02:51 233
2017-07-27T01:03:01 234
2017-07-28T01:01:01 235
2017-09-07T09:05:18 236
2017-09-07T10:22:10 237

bjb@rhino:~$ sed -n ':begin H;/^2017-07-27/{s/^.*$//;x;s/^.*$//;n;b middle};$ b end;n;b begin;:middle H;$ b end;n;b middle;:end x;p;q' /tmp/sed.txt

2017-07-27T01:02:51 233
2017-07-27T01:03:01 234
2017-07-28T01:01:01 235
2017-09-07T09:05:18 236
2017-09-07T10:22:10 237

bjb@rhino:~$ sed -n ':begin H;/^fluffallaa/{s/^.*$//;x;s/^.*$//;n;b middle};$ b end;n;b begin;:middle H;$ b end;n;b middle;:end x;p;q' /tmp/sed.txt

2017-07-26T01:01:01 231
2017-07-27T01:02:01 232
2017-07-27T01:02:51 233
2017-07-27T01:03:01 234
2017-07-28T01:01:01 235
2017-09-07T09:05:18 236
2017-09-07T10:22:10 237

bjb@rhino:~$ 
永远不要说永远

我们可以使用sed保持空间来收集所需的输出。如果我们将第一行与日期匹配,我们将丢弃保留空间中累积的内容,并重新开始将行收集到保留空间中。在文件末尾,我们打印出保留空间的内容

整个文件可能会在保留空间中结束。我想我们可以开始直接打印每一行,而不是在找到匹配项后累积到保留空间。。。大概但是如果没有匹配项,我们仍然必须在保留空间中累积整个文件,因为最后一行可能会有匹配项,我们必须扔掉所有内容。但我很高兴这样

我稍微修改了示例输入,以便在开发sed脚本时更容易看到哪行是哪行

bjb@rhino:~$ cat /tmp/sed.txt
2017-07-26T01:01:01 231
2017-07-27T01:02:01 232
2017-07-27T01:02:51 233
2017-07-27T01:03:01 234
2017-07-28T01:01:01 235
2017-09-07T09:05:18 236
2017-09-07T10:22:10 237

bjb@rhino:~$ sed -n ':begin H;/^2017-07-27/{s/^.*$//;x;s/^.*$//;n;b middle};$ b end;n;b begin;:middle H;$ b end;n;b middle;:end x;p;q' /tmp/sed.txt

2017-07-27T01:02:51 233
2017-07-27T01:03:01 234
2017-07-28T01:01:01 235
2017-09-07T09:05:18 236
2017-09-07T10:22:10 237

bjb@rhino:~$ sed -n ':begin H;/^fluffallaa/{s/^.*$//;x;s/^.*$//;n;b middle};$ b end;n;b begin;:middle H;$ b end;n;b middle;:end x;p;q' /tmp/sed.txt

2017-07-26T01:01:01 231
2017-07-27T01:02:01 232
2017-07-27T01:02:51 233
2017-07-27T01:03:01 234
2017-07-28T01:01:01 235
2017-09-07T09:05:18 236
2017-09-07T10:22:10 237

bjb@rhino:~$ 

您想要什么输出?您是否希望获得日期列表?不够详细,因此应删除前三行?日志中的记录总是按日期顺序排列的。您可以检查日期是否出现,并删除
2017-07-27
之前的所有记录。如说明所述,给定的命令将删除带有日期的行之前的所有行,以及带有日期的第一行。这是可以接受的,在我的情况下,删除所有或仅删除第一行并不重要。好吧,我自己找到了它:sed-一个STEAM编辑器,因此,如果模式不在文件中,编辑器将从第一行开始,找不到匹配项并删除。这会一直持续到文件的末尾,因为永远不会有匹配!因此答案是:我无法阻止它使用sed。时期您想要什么输出?您是否希望获得日期列表?不够详细,因此应删除前三行?日志中的记录总是按日期顺序排列的。您可以检查日期是否出现,并删除
2017-07-27
之前的所有记录。如说明所述,给定的命令将删除带有日期的行之前的所有行,以及带有日期的第一行。这是可以接受的,在我的情况下,删除所有或仅删除第一行并不重要。好吧,我自己找到了它:sed-一个STEAM编辑器,因此,如果模式不在文件中,编辑器将从第一行开始,找不到匹配项并删除。这会一直持续到文件的末尾,因为永远不会有匹配!因此答案是:我无法阻止它使用sed。时期