Shell 如何使用grep命令修剪日志文件

Shell 如何使用grep命令修剪日志文件,shell,grep,winscp,Shell,Grep,Winscp,例如:如果下面是我日志文件的内容,我只想保留第一次出现值“2018”和最后一次出现值“2018”之间的内容 sssssssssssssssssssss ddddddddddddddddddddd 2018fffffffffffffffff dddddd2018ddddddddddd wwww2018wwwwwwwwwwwww aaaaaaaaaaaa2018aaaaa 输出应为: 2018fffffffffffffffff dddddd2018ddddddddddd wwww2018wwwww

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

sssssssssssssssssssss
ddddddddddddddddddddd
2018fffffffffffffffff
dddddd2018ddddddddddd
wwww2018wwwwwwwwwwwww
aaaaaaaaaaaa2018aaaaa
输出应为:

2018fffffffffffffffff
dddddd2018ddddddddddd
wwww2018wwwwwwwwwwwww
aaaaaaaaaaaa2018

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

“-z” “-空数据” 将输入和输出数据视为行序列,每行终止 由零字节表示ASCII NUL字符,而不是换行符。 与'-Z'或'-null'选项类似,此选项可与一起使用 像“sort-z”这样的命令可以处理任意文件名。 例如:

grep -zo '2018.*2018' infile
输出:

2018fffffffffffffffff dddddd 2018dddddddddddddddddd WWWW2018WWWWWWWWWWWW AAAAA 2018
检查此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
>

你试过什么?请显示您迄今为止的尝试,以便我们可以帮助您使用代码。这和winscp有什么关系?我创建了一个bat文件,它运行winscp脚本从远程服务器下载一个日志文件响应日志。日志文件显然会按原样下载所有请求的响应。下载日志文件后,我只想剪切特定于我的唯一ID的响应。bat文件中的脚本如下:winscp.com/command^opensftp://xxx.com/ -hostkey=*get/var/log/jboss_-sit/suFile.log exit^您需要在问题中加入这一点和更多细节。bash甚至POSIX shell中的解决方案将非常简单,但除非我知道它是什么,否则我无法复制您的环境。它是否打印aaaaaaaaaaaaaaaa2018aaaaaaaaaaaaa???@stack0114106:不使用GNU grepthanks@stack0114106和@Thor。你能帮我找到解决方案吗。我写了下面的代码,但它只检索与2018匹配的行,但我想要2018年第一次和最后一次出现之间的所有行。findstr/s 2018 suFile.log>results.log