日志翻转时,如何在多个日志之间执行开始和结束时间之间的'sed'操作。?



$ls -lrt test*log*

-rwxr----- 1 root xyzgroup 54231265 Sep  4 16:06 test.log.9
-rwxr----- 1 root xyzgroup 53990979 Sep  4 16:06 test.log.8
-rwxr----- 1 root xyzgroup 53372511 Sep  4 16:06 test.log.7

$cat test.log.9|head -5

Sep  4 12:59:01.701796 <sometext>
Sep  4 12:59:01.701796 <sometext>
Sep  4 12:59:01.720171 <sometext>
Sep  4 12:59:01.720171 <sometext>
Sep  4 12:59:01.720699 <sometext>

$cat test.log.9|tail -5

Sep  4 13:16:01.880489 <sometext>
Sep  4 13:16:01.880489 <sometext>
Sep  4 13:16:01.880489 <sometext>
Sep  4 13:16:01.880489 <sometext>
Sep  4 13:16:01.880489 <sometext>

$cat test.log.8|head -5

Sep  4 13:16:01.898749 <sometext>
Sep  4 13:16:01.898749 <sometext>
Sep  4 13:16:01.898749 <sometext>
Sep  4 13:16:01.898948 <sometext>
Sep  4 13:16:01.898948 <sometext>

$cat test.log.8|tail -5

Sep  4 13:35:02.513804 <sometext>
Sep  4 13:35:02.513804 <sometext>
Sep  4 13:35:02.513804 <sometext>
Sep  4 13:35:02.514136 <sometext>
Sep  4 13:35:02.514136 <sometext>

每行开头的日志格式:

命令:

sed -rn '/Sep 4 09:38:*/,/Sep 4 11:23:*/p' test*log* > temp_test.log

观察:对列出的文件执行sed操作时,不会提取开始和结束时间之间所需的日志内容。相反,它将获取部分日志行,或者有时输出文件大小会增加(以GB为单位(。此外,对于较短持续时间的日志行,也会适当地提取一些时间。

预期:记录开始和结束时间戳之间的行。


还原后代表OP编辑:

当使用ssh将bodo的答案中的解决方案作为远程命令进行尝试时,会出现错误:

local machine$ sudo ssh user@1.2.3.4 "sudo sed -rn '/Sep 4 09:38:*/,/Sep 4 11:23:*/p' $(ls -vr /user/xyz/test*log*)" > temp_test.log
ls: cannot access /user/xyz/test*log*: No such file or directory

如果问题仅由传递给sed的输入文件的顺序引起,则可以使用ls命令的排序选项-v(在您的特定用例中(。

-v natural sort of (version) numbers within text

比较

echo test.log*
echo $(ls -vr test.log*)

在您的具体情况下,您可以尝试

sed -rn '/Sep  4 09:38:*/,/Sep  4 11:23:*/p' $(ls -vr test.log*) > temp_test.log

注意:此解决方案并非在所有情况下都有效
它要求模式test*log*产生的文件名不包含任何空白或特殊字符。问题中显示的文件名满足此要求。

通常,执行分词以从命令输出中提取文件名是有问题的,应该避免。

在不了解输入文件内容的情况下,无法检查是否存在其他可能导致问题中所述问题的原因。


关于远程执行的附加问题的答案:

命令

sudo ssh user@1.2.3.4 "sudo sed -rn '/Sep 4 09:38:*/,/Sep 4 11:23:*/p' $(ls -vr /user/xyz/test*log*)" > temp_test.log

不工作,因为ls -vr /user/xyz/test*log*在本地计算机上运行。

您可以尝试引用以在远程机器上执行此部分,但这可能会变得复杂。

我建议在远程机器上创建一个shell脚本,例如/home/user/logfilter

#!/bin/sh
if [ $# lt 2 ]
then
echo "usage: logfilter from to" >&2
exit 1
fi
from="$1"
to="$2"
sed -rn "/^$from/,/^$to/p" $(ls -vr /user/xyz/test*log*)

并像这样运行

sudo ssh user@1.2.3.4 "sudo ./logfilter 'Sep 4 09:38:' 'Sep 4 11:23:'" > temp_test.log

(未经测试(

最新更新