逐行读取文本文件并检查该行是否有特定的string

我正在尝试使用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 

如果您有任何build议,请让我知道! 我对其他select是开放的,因为我一直试图这样做太久。

澄清:

我正在通过一个文件行(while循环),然后我greaps该行,看看“Completed”是一个子string和grepping,看看“脚本已完成”是一个子string(Grep将设置variables的整个行)。 那么当我做检查,如果variables是完成我想摆脱while循环,如果不检查“脚本已完成”是一个子string,所以我可以增加一个计数器(我正在计算多less脚本完成之前“完成”)。

关于:

当我做var1 = $(grep -s“Completed”$ line)为什么它findCompleted的所有实例…我想如果即时通过一行行,它将只能find该行中的实例。

编辑:

我用下面的awk答案。 我所要做的就是删除{next}语句,并且完美地工作。

谢谢

你有几个错误。 另外你可能要考虑一个工具,这是为了做这种事情。 awk是这些工具之一。

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

第一行在与行上任何地方匹配“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 

grep会返回一个整行,你是在测试“blah blah”,并期望只有“blah blah”作为整个结果吗?

错误#1:

当我做var1 = $(grep -s“Completed”$ line)时,为什么会找到Completed的所有实例

在上面的命令grep希望$line是一个文件名,而不是一个字符串。 如果你想传递字符串,你需要使用管道:

 var1=$(echo "$line" | grep -s "Completed") 

或者在Bash中,你可以使用字符串重定向:

 var1=$(grep -s "Completed" <<<"$line") 

错误#2:

if[[test命令]之间应该有空格)


这个grep命令可能会和你试图用这个代码一样:

 grep -v "Completed" file.txt | grep -c "Script Finished" 

grep -v "Completed" file.txt返回不包含“Completed”的行,并通过管道发送给下一个grep ,该管道返回包含文本“Script Finished”的行数。

我在(当前)接受的解决方案之后发布这个内容,因为接受的解决方案是使用不受标签覆盖的语言。

您可以使用case语句在shell中执行相同的操作。 (尽管对于大文件,awk或grep可能会更快)

 while read line; do case "$line" in *"Completed"*)break;; *"Script Finished"*)count=$((count + 1));; esac done < file.txt 

注意:这种形式的while read line; …将省略最后一行,如果不正确, while read line || [ "$line" ] while read line || [ "$line" ] (这是为什么一些IDE会在文件末尾添加一个空的新行的一个原因)