Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何执行';sed';在日志翻转的情况下,多个日志之间的开始和结束时间之间的操作。?_Linux_Bash - Fatal编程技术网

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
和输出重定向在本地计算机上执行。