Linux 如何执行';sed';在日志翻转的情况下,多个日志之间的开始和结束时间之间的操作。?
$Linux 如何执行';sed';在日志翻转的情况下,多个日志之间的开始和结束时间之间的操作。?,linux,bash,Linux,Bash,$ls-轻轨测试*日志* -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 <somete
ls-轻轨测试*日志*
-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>
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>
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>
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>
$cat test.log.8 | 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>
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>
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>
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
以远程命令的形式尝试解决方案时,出现错误:
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文本中的自然排序(版本)编号
比较
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
(未测试)请回答您的问题,并显示几个示例输入文件的内容、您使用的确切命令以及此输入产生的实际和预期结果。
sed
命令(在问题的第1个版本中)似乎是从stdin读取的,而不是从问题中显示的文件读取的。提示:可能是排序问题。传递给命令的文件顺序可能不是您所期望的。不幸的是,在我之前的评论中编辑错误已经太晚了。我的意思是“…以及由此输入产生的实际和预期输出。”模式/sep4 09:38://
并不意味着sep4 09:38:
后跟任何内容(正如您可能期望的那样),而是sep4 09:38
后跟任意数量的冒号(:
),包括0。你的意思可能是/Sep 4 09:38:.*/
。如果只想在行首找到此模式,则应使用^
锚定它。否则,它可能会在任何地方匹配包含此模式的行。在这种情况下,您可以省略尾随的*
,即/^Sep 4 09:38://
。请显示将重现问题的示例输入文件。请指定您使用的shell。(bash?,zsh?,…)它的bash。我还更新了问题中的日志内容。在上面的日志中,im在时间戳之间进行搜索。在这种情况下,直到第一个日志test.log.9的“Sep 4 13:16:01.880489”才提取日志。您的输入文件仍然不清楚。不要显示几行大的真实日志文件,而是创建几个示例文件,每个文件都有几行可以用来重现问题。显示与示例文件匹配的实际和预期输出。(如果需要重现不同的问题,可以提供多个示例。)请参阅并感谢该命令,当我在存在日志的本地计算机上运行它时,它可以完美地工作。我的要求是,如果我试图从本地计算机运行此命令以从远程计算机获取日志,ls命令将给我一个错误。本地计算机$sudo sshuser@1.2.3.4“sudo sed-rn'/Sep 4 09:38://,/Sep 4 11:23://p'$(ls-vr/user/xyz/testlog)“>temp_test.log下面出现错误:ls:无法访问/user/xyz/testlog:没有这样的文件或directory@Ajay请不要在评论中写额外的要求。将其添加到问题中。除非注释很短且格式正确,否则很难阅读注释中的代码。命令ls-vr/user/xyz/testlog
和输出重定向在本地计算机上执行。