【问题标题】:sed delete lines before line beginning with pattern, do nothing if pattern not foundsed 删除以模式开头的行之前的行,如果找不到模式则不执行任何操作
【发布时间】:2018-02-16 08:17:12
【问题描述】:

我想使用 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 删除所有行? 有没有更好的方法来做到这一点?

【问题讨论】:

  • 你想要什么输出?您是否要获取日期列表?
  • 不够准确所以应该删除前三行?
  • 日志中的记录始终按日期顺序排列。您可以检查日期是否发生并删除2017-07-27之前的所有记录
  • 如解释中所述,给定的命令会删除包含日期的行之前的所有行,以及包含日期的第一行。这是可以接受的,就我而言,是否删除全部或仅删除第一个都没有关系。
  • 好的,我自己想通了:sed - STEAM 编辑器,所以,如果文件中没有模式,编辑器将从第一行开始,找不到匹配项并删除。这一直持续到文件的末尾,因为永远不会有匹配!因此答案是:我无法使用 sed 阻止它。期间!

标签: sed


【解决方案1】:

永远不要说永远。

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

整个文件最终可能会在保留空间中。我想我们可以直接开始打印每一行,而不是在找到匹配项后累积到保留空间……也许吧。但是如果没有匹配,我们仍然需要在保持空间中累积整个文件——因为可能在最后一行会有匹配,我们必须扔掉所有东西。但我对此很满意。

我稍微更改了示例输入,以便在开发 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:~$ 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2021-01-08
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    相关资源
    最近更新 更多