linux - 使用sed通过目录中的多个文件获取模式范围

标签 linux bash

我想知道是否可以使用 sed 命令找到 2 个模式(在本例中为日期)之间的范围并将范围内的这些行输出到新文件。

现在,我只查看一个文件并获取文件 FileMoverTransfer.log 的时间范围内的行。但是,经过一段时间后,这些日志会移动到后缀为 FileMoverTransfer.log-20180404-xxxxxx.gz 的新日志文件中。这是我当前的代码:

sed -n '/^'$start_date'/,/^'$end_date'/p;/^'$end_date'/q' FileMoverTransfer.log >>/public/FileMoverRoot/logs/intervalFMT。日志

虽然这不起作用,因为 sed 无法查看目录中以 FileMoverTransfer.log 开头的所有文件?

sed -n '/^'$start_date'/,/^'$end_date'/p;/^'$end_date'/q' FileMoverTransfer.log* >> /public/FileMoverRoot/logs/intervalFMT.log

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

范围运算符仅在单个文件中运行,因此如果开头在一个文件中而结尾在另一个文件中,则不能使用它。

您可以使用 cat 连接所有文件,并将其通过管道传递给 sed:

cat FileMoverTransfer.log* | sed -n "/^$start_date/,/^$end_date/p;/^$end_date/q" >> /public/FileMoverRoot/logs/intervalFMT.log

您可以使用双引号,而不是引用和取消引用 sed 命令,以便在其中扩展变量。如果变量包含空格,这也可以防止出现问题。

关于linux - 使用sed通过目录中的多个文件获取模式范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49659001/

相关文章:

linux - bash 子 shell 与 vanilla 命令执行

linux - 如何在目录和子目录中的所有文件中用另一个字符串模式替换字符串模式

linux - 为什么这个egrep命令在我的shell中有效,但在Perl中无效?

bash - shell 脚本中的 SPRINTF?

c - 我如何知道对特定程序使用哪个 exec 命令?

linux - 如何将 perf(Linux 工具)的输出保存到文件中?

linux - 如何在CentOS中安装sendmail?

javascript - angular & apache - $scope 已更新但需要单击某处才能在界面上显示

bash - `sudo -i -u user` 和 `sudo su - user` 有什么区别?

python - 每个 arg 具有多个值的 arg 解析器的最佳实践