2

我很好奇在以下情况下哪个更快。我有大约 2MB 的输出文件和数千行(我们会说在 15k - 50k 之间的任何地方)。

我正在文件末尾(最后 10 行)左右寻找一个字符串。我多次这样做,有时使用相同的文件的最后 10 行,并且用于多个文件。

我很好奇以下哪个是最快和最有效的:

  1. tail最后 10 行,将它们保存为变量。当我需要grep或检查字符串时,echo该变量和grep输出
  2. 每次我需要grep一些东西时,首先tail是输出文件,然后pipegrep输出
  3. 放弃上述任何一项,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
4

2 回答 2

4

选项 2 使用 tail 两次,因此可能会比 1 稍慢。两者都比选项 3 快很多。

您可以做的另一件事是:

if [ -f "$jobFile".out ]; then
{
  !(tac "$jobFile".out | 
    grep -E -m1 -q "(Command exited with non-zero status|Error termination via Lnk1e)")
    && continue
  {
    output "$(grep $jobID $curJobsFile)"
    sed -i "/$jobID/d" "$jobIDsWithServer"
  }
fi

这将以相反的顺序输出文件,并且 grep 将在第一次匹配后停止。它还将同时搜索两个搜索词,如果它与第一个词不匹配,则无需两次 grep。

于 2013-04-11T13:43:08.693 回答
1

为什么不这样:

if tail -f "$jobfile.out" \ 
    | grep -F -e "Command exited with non-zero status" -e "Error termination via Lnk1e"
then
   output "$(grep $jobID $curJobsFile)"
   sed -i "/$jobID/d" "$jobIDsWithServer"
fi

通过这种方式,您可以实时搜索尾部的输出,直到找到您要查找的内容。

当您不使用正则表达式时,在 grep 中使用该-F标志会更快。

于 2013-04-11T14:08:48.370 回答