【问题标题】:How to trim a log file using grep command如何使用 grep 命令修剪日志文件
【发布时间】:2019-03-08 14:49:09
【问题描述】:

例如:如果下面是我的日志文件的内容,我只想保留第一次出现的值“2018”和最后一次出现的“2018”之间的内容

sssssssssssssssssssss
ddddddddddddddddddddd
2018fffffffffffffffff
dddddd2018ddddddddddd
wwww2018wwwwwwwwwwwww
aaaaaaaaaaaa2018aaaaa

输出应该是:

2018fffffffffffffffff
dddddd2018ddddddddddd
wwww2018wwwwwwwwwwwww
aaaaaaaaaaaa2018

【问题讨论】:

  • 你试过什么?请展示您到目前为止的尝试,以便我们可以帮助您编写代码。这和winscp有什么关系?
  • 我创建了一个 bat 文件,它运行 WinSCP 脚本以从远程服务器下载日志文件(响应日志)。日志文件显然按原样下载(所有请求的响应)。下载日志文件后,我只想剪切特定于我的唯一 ID 的响应。我的 bat 文件中的脚本如下:winscp.com/command ^ "open sftp://xxx.com/ -hostkey=*" "get /var/log/jboss_sit/suFile.log" "exit" ^
  • 您需要将这一点和更多细节放入您的问题。 bash 甚至 POSIX shell 中的解决方案都非常简单,但除非我知道它是什么,否则我无法复制您的环境。

标签: shell grep winscp


【解决方案1】:

如果文件不是太大,您可以使用 GNU grep 和 -z 标志来完成。来自grep.info

‘-z’
‘--null-data’
     Treat input and output data as sequences of lines, each terminated
     by a zero byte (the ASCII NUL character) instead of a newline.
     Like the ‘-Z’ or ‘--null’ option, this option can be used with
     commands like ‘sort -z’ to process arbitrary file names.

例如:

grep -zo '2018.*2018' infile

输出:

2018fffffffffffffffff
dddddd2018ddddddddddd
wwww2018wwwwwwwwwwwww
aaaaaaaaaaaa2018

【讨论】:

  • 不打印 aaaaaaaaaaaa2018aaaaa 吗??
  • @stack0114106: 不适用于 GNU grep
【解决方案2】:

检查这个 Perl 解决方案

> cat 2018_match
sssssssssssssssssssss
ddddddddddddddddddddd
2018fffffffffffffffff
dddddd2018ddddddddddd
wwww2018wwwwwwwwwwwww
aaaaaaaaaaaa2018aaaaa
> perl -e ' BEGIN { $x=qx(cat 2018_match);$x=~s/(.+?)(2018.+2018)(.+)/$2/osmg; print "$x\n" ; exit } '
2018fffffffffffffffff
dddddd2018ddddddddddd
wwww2018wwwwwwwwwwwww
aaaaaaaaaaaa2018
>

【讨论】:

  • 感谢@stack0114106 和@Thor。你能帮我找到findstr解决方案吗?我写了下面的代码,但它只检索与 2018 匹配的行,但我想要 2018 的第一次和最后一次出现之间的所有行。findstr /s "2018" suFile.log > results.log
猜你喜欢
  • 2011-05-02
  • 1970-01-01
  • 2012-03-28
  • 2021-07-11
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
相关资源
最近更新 更多