【发布时间】:2013-04-03 17:29:48
【问题描述】:
我很好奇在以下情况下哪个更快。我有大约 2MB 的输出文件和数千行(我们会说在 15k 到 50k 之间的任何地方)。
我正在寻找文件末尾的字符串(最后 10 行)左右。我多次这样做,有时使用相同的文件的最后 10 行,并且针对多个文件。
我很好奇以下哪个是最快和最有效的:
-
tail最后10行,保存为变量。当我需要grep或检查字符串时,echo那个变量和grep在输出上 - 每次我需要
grep的东西,首先tail输出文件然后pipe和grep输出 - 放弃上述任何一项,每次只需
grep整个文件。
选项 1)
if [ -f "$jobFile".out ]; then
{
output=$(tail -n 10 "$jobFile".out)
!((echo "$output" | grep -q "Command exited with non-zero status" )
|| (echo "$output" | grep -q "Error termination via Lnk1e"))
&& continue
{
output "$(grep $jobID $curJobsFile)"
sed -i "/$jobID/d" "$jobIDsWithServer"
}
fi
选项 2)
if [ -f "$jobFile".out ]; then
{
!((tail -n 10 "$jobFile".out | grep -q "Command exited with non-zero status" )
|| (tail -n 10 "$jobFile".out | grep -q "Error termination via Lnk1e"))
&& continue
{
output "$(grep $jobID $curJobsFile)"
sed -i "/$jobID/d" "$jobIDsWithServer"
}
fi
选项 3)
if [ -f "$jobFile".out ]; then
{
!((grep -q "Command exited with non-zero status" "$jobFile".out)
|| (grep -q "Error termination via Lnk1e" "$jobFile".out))
&& continue
{
output "$(grep $jobID $curJobsFile)"
sed -i "/$jobID/d" "$jobIDsWithServer"
}
fi
【问题讨论】:
-
Linux 有一个
time命令用于计时命令运行所需的时间。我打赌你可以在这里使用它。 -
你也可以使用
strace之类的东西来查看每个选项调用了哪些IO操作。 -
大括号和圆括号是怎么回事?在这种情况下,它们不仅不是(全部)必需的,而且显然容易出错(您似乎缺少右括号)。
-
@glennjackman 这是我脚本中的部分复制/部分重写。无论是否需要大括号,它至少有助于提高我的可读性。当然,对于 if 块,它有助于将其与其他所有内容区分开来。不过你是对的,我在这个键入的示例中缺少一个,但在我的实际脚本中却没有。
-
好的,但请注意大括号和圆括号是不同的:圆括号实际上生成了一个子 shell,而大括号在当前 shell 中执行。所以这个
((echo foo) && (echo bar))实际上必须完成生成其他 3 个 shell 的工作。
标签: linux performance bash grep tail