逐行读取文本文件并检查该行是否具有某个字符串

Ala*_*lan 5 unix linux shell scripting

我试图使用Shell Scripting逐行读取文本文件.我一直在做的是

while read line
do
   var1=$(grep -s "Completed" $line)
   var2=$(grep -s "Script Finished" $line)

if[ "$var1" = "$line" ]
   break
else
   if[ "$var2" = "$line" ]
       count='expr $count + 1'
   else
      countinue
   fi
fi
done < file.txt
Run Code Online (Sandbox Code Playgroud)

如果您有任何建议,请让我知道!我对其他选择持开放态度,因为我一直试图这么做.

澄清:

我逐行浏览一个文件(while循环)然后我在grepping那一行,看看"Completed"是否是一个子字符串,并查看"Script Finished"是否是一个子字符串(Grep将变量设置为整行).那么当我检查变量是否已完成时我想要打破while循环,如果不检查"Script Finished"是否是一个子串,那么我可以递增一个计数器(我试图计算在完成之前完成的脚本数量)完成").

关于:

当我做var1 = $(grep -s"已完成"$ line)为什么它会找到所有已完成的实例...我想如果我逐行浏览它只会找到该特定行中的实例.

编辑:

我用下面的awk答案.我所要做的就是删除{next}语句,它完美无缺.

谢谢

jim*_*ara 4

你有几个错误。另外,您可能需要考虑一个用于执行此类操作的工具。awk 就是其中之一。

awk '/blah blah/ {exit} 
     /Finished/ {count+=1} 
     {next}
     END{ print count} ' filename
Run Code Online (Sandbox Code Playgroud)

当第一行与该行任何地方的“blah blah”匹配时,第一行退出。

第二行计算“已完成”匹配的数量。

{next} 位用于继续读取而不是打印每一行 - 这在 awk 的某些版本中会发生。

最后一行 END {} 函数在代码完成文件时运行。它显示计数值。

我选择了 awk 方法,而不是尝试修复 shell 脚本中的逻辑和语法错误。如果您需要这种帮助,请考虑在命令行上单独运行几乎每个代码块(或行)。我假设你使用的是 bash。

错误示例

-eq to compare strings, use =, example:  [ "$var" = "something" ]
$(var1) should be either "${var1}" or "$var1" lines 4 and 8
Run Code Online (Sandbox Code Playgroud)

grep 返回一整行,您是否正在测试“blah blah”并期望只是“blah blah”作为整个结果?