linux - 逐行读取文本文件并检查该行是否包含特定字符串

标签 linux shell unix scripting

我正在尝试使用 Shell 脚本逐行读取文本文件。我一直在做的是

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

如果您有任何建议,请告诉我!我对其他选择持开放态度,因为我尝试这样做的时间太长了。

澄清:

我逐行浏览一个文件(while 循环)然后我对该行进行 grep 以查看“Completed”是否是一个子字符串,然后 grep 以查看“Script Finished”是否是一个子字符串(Grep 会将变量设置为整行)。因此,当我检查变量是否已完成时,如果不检查“Script Finished”是否是一个子字符串,我想跳出 while 循环,这样我就可以增加一个计数器(我试图计算在“之前完成了多少脚本”完成”)。

困惑:

当我执行 var1=$(grep -s "Completed"$line) 时,为什么它会找到 Completed 的所有实例...我想如果我逐行查看它只会找到特定行中的实例。

编辑:

我使用了下面的 awk 答案。我所要做的就是删除 {next} 语句,它可以完美运行。

谢谢

最佳答案

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

awk '/blah blah/ {exit} 
     /Finished/ {count+=1} 
     {next}
     END{ print count} ' filename

当第一行在行中的任何地方匹配“blah blah”时退出。

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

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

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

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

错误示例

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

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

关于linux - 逐行读取文本文件并检查该行是否包含特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31030670/

相关文章:

linux - 如何在 linux 上运行后台进程,然后在解析输出后将其终止?

linux - unix 中的数据函数

c++ - 中间件消息系统c++

linux - 从模式的出现开始读取文件的行

linux - Bash - While 循环

linux - Chef 推荐的执行命令的方式

linux - 将整个站点从 HTTP 迁移到 HTTPS 对 API 用户有何影响?

linux - 如果插件已经在网站上,请更新它

java - 用 shell 编写的 Hadoop 命令未从 java 调用

macos - mac 上进程的内存快照?