逐行读取文本文件并检查该行是否包含特定字符串
Reading through a text file line by line and checking if that line has a certain 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
如果您有任何建议,请告诉我!我对其他选择持开放态度,因为我尝试这样做的时间太长了。
澄清:
我逐行浏览一个文件(while 循环)然后我对该行进行 grep 以查看 "Completed" 是否是一个子字符串,然后 grep 以查看 "Script Finished" 是否是一个子字符串(Grep会将变量设置为整行)。因此,当我检查变量是否已完成时,如果不检查 "Script Finished" 是否为子字符串,我想跳出 while 循环,这样我就可以增加一个计数器(我正在尝试计算之前完成的脚本数量"Complete").
困惑:
当我执行 var1=$(grep -s "Completed" $line) 为什么它会找到 Completed 的所有实例...我想如果我逐行查看它只会找到那条线。
编辑:
我使用了下面的 awk 答案。我所要做的就是删除 {next} 语句,它可以完美运行。
谢谢
您有几个错误。另外,您可能需要考虑一种旨在执行此类操作的工具。 awk 就是其中一种工具。
awk '/blah blah/ {exit}
/Finished/ {count+=1}
{next}
END{ print count} ' filename
第一行在与行中的任何地方 "blah blah" 匹配时退出。
第二行计算 "Finished" 匹配的数量。
{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 returns 整行,您是否正在测试 "blah blah" 并期望仅 "blah blah" 作为整个结果?
错误 #1:
When I do var1=$(grep -s "Completed" $line) why does it find all
instances of Completed
在上面的命令中,grep
期望 $line
是文件名而不是字符串。如果你想传递字符串你需要使用管道:
var1=$(echo "$line" | grep -s "Completed")
或者在 Bash 中你可以使用字符串重定向:
var1=$(grep -s "Completed" <<<"$line")
错误#2:
if
和[
之间应该有space([
是test
命令)
此 grep
命令可能与您尝试使用该代码执行的操作相同:
grep -v "Completed" file.txt | grep -c "Script Finished"
grep -v "Completed" file.txt
returns 不包含 "Completed" 的行并通过 returns 包含文本的行计数的管道发送到下一个 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" ]
(这是某些 IDE 会添加一个空的新行的原因之一到文件末尾)
我正在尝试使用 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 循环,这样我就可以增加一个计数器(我正在尝试计算之前完成的脚本数量"Complete").
困惑:
当我执行 var1=$(grep -s "Completed" $line) 为什么它会找到 Completed 的所有实例...我想如果我逐行查看它只会找到那条线。
编辑:
我使用了下面的 awk 答案。我所要做的就是删除 {next} 语句,它可以完美运行。
谢谢
您有几个错误。另外,您可能需要考虑一种旨在执行此类操作的工具。 awk 就是其中一种工具。
awk '/blah blah/ {exit}
/Finished/ {count+=1}
{next}
END{ print count} ' filename
第一行在与行中的任何地方 "blah blah" 匹配时退出。
第二行计算 "Finished" 匹配的数量。
{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 returns 整行,您是否正在测试 "blah blah" 并期望仅 "blah blah" 作为整个结果?
错误 #1:
When I do var1=$(grep -s "Completed" $line) why does it find all instances of Completed
在上面的命令中,grep
期望 $line
是文件名而不是字符串。如果你想传递字符串你需要使用管道:
var1=$(echo "$line" | grep -s "Completed")
或者在 Bash 中你可以使用字符串重定向:
var1=$(grep -s "Completed" <<<"$line")
错误#2:
if
和[
之间应该有space([
是test
命令)
此
grep
命令可能与您尝试使用该代码执行的操作相同:
grep -v "Completed" file.txt | grep -c "Script Finished"
grep -v "Completed" file.txt
returns 不包含 "Completed" 的行并通过 returns 包含文本的行计数的管道发送到下一个 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" ]
(这是某些 IDE 会添加一个空的新行的原因之一到文件末尾)