$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
(未经测试(