Linux 逐行读取文本文件并检查该行是否有特定字符串
我正在尝试使用Shell脚本逐行读取文本文件。我一直在做的是Linux 逐行读取文本文件并检查该行是否有特定字符串,linux,shell,unix,scripting,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
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
读取行时
做
var1=$(grep-s“Completed”$行)
var2=$(grep-s“脚本完成”$行)
如果[“$var1”=“$line”]
打破
其他的
如果[“$var2”=“$line”]
count='expr$count+1'
其他的
倒计时
fi
fi
完成
如果你有任何建议,请让我知道!我对其他选择持开放态度,因为我已经尝试这样做太久了
澄清:
我将逐行浏览一个文件(while循环),然后我将该行灰显以查看“Completed”是否为子字符串,并灰显以查看“Script Finished”是否为子字符串(Grep将变量设置为整行)。因此,当我检查变量是否完成时,如果不检查“Script Finished”是否是子字符串,我想中断while循环,以便我可以增加一个计数器(我试图计算在“Complete”之前完成了多少脚本)
困惑于:
当我执行var1=$(grep-s“Completed”$行)时,为什么它会找到Completed的所有实例。。。我想如果我一行一行地看,它只会在那一行找到实例
编辑:
我使用了下面的awk答案。我所要做的就是删除{next}语句,它就能完美地工作
谢谢您有几个错误。另外,你可能想考虑一个工具来做这种事情。awk就是其中之一
awk '/blah blah/ {exit}
/Finished/ {count+=1}
{next}
END{ print count} ' filename
当第一行与行中的任何一个“废话”匹配时,它退出
第二行统计“完成”匹配的数量
{next}位用于保持读取,而不是打印每一行-在awk的某些版本中会发生这种情况
最后一行,END{}函数,在代码完成文件时运行。它显示count的值
我选择了awk方法,而不是试图修复shell脚本中的逻辑和语法错误。如果需要这样的帮助,请考虑在命令行上几乎每一个代码块(或代码行)。我猜你用过bash
错误示例
-eq to compare strings, use =, example: [ "$var" = "something" ]
$(var1) should be either "${var1}" or "$var1" lines 4 and 8
grep返回一整行,您是否正在测试“废话”,并期望整个结果仅为“废话”?错误#1:
当我执行var1=$(grep-s“Completed”$行)时,为什么它会找到所有
已完成项目的实例
在上面的命令中,grep
期望$line
是文件名而不是字符串。如果要传递字符串,则需要使用管道:
var1=$(echo "$line" | grep -s "Completed")
或者在Bash中,可以使用字符串重定向:
var1=$(grep -s "Completed" <<<"$line")
grep-v“Completed”file.txt
返回不包含“Completed”的行,并通过管道发送到下一个grep
,该管道返回包含文本“Script Finished”的行数。我在(当前)之后发布此消息接受的解决方案,因为接受的解决方案使用的语言不在标记的范围内
您可以在shell中使用case语句执行相同的操作。
(尽管对于大文件,awk或grep可能更快)
读行时;做
大写“$line”
*“已完成”*)中断;;
*“脚本完成”*)计数=$((计数+1));;
以撒
完成
注:这种形式的
在读行时代码>。。。将省略最后一行,如果这不正确,请在读取第| |[“$line”]”行时使用
(这是某些IDE将在文件末尾添加一个空新行的原因之一)您想用它实现什么?你能提供一些信息吗?是的,我当然道歉。我试图浏览一个文件,其中列出了脚本运行的时间。所以我只关心脚本是否完成。。如果完成,我将增加计数器。但是,脚本是分块运行的。。早晚。因此,我用“废话废话”(脚本已完成)打破循环,因为这将是早上完成的脚本数量。如果您不尝试一次完成所有工作,而是专注于单个部分的工作,那么您将可以更轻松地完成这项工作并找到相关资源。例如,您应该定义两个字符串a=“hello world”b=“panda”
,并尝试编写一个if语句来比较它们(然后设置b=$a
,以确保正反两种情况都有效)。谷歌搜索“如何比较shell脚本中的字符串”要比搜索“如何逐行读取文本文件检查该行是否有特定字符串”容易得多。我想我最重要的问题是,如果我将它设置为变量,grep会返回什么。grep返回那个,它会返回什么。不管你是否把它指向一个变量,我现在就要试试这个。。谢谢你的回答,我会告诉你发生了什么。我正在测试grep等等的$line和$line。。但你的方式似乎好多了。我听说awk可以很容易地取代grep。awk'/Completed/{exit}/Finished/{count+=1}{next}END{print count}文件名
似乎是无限循环的,明白了吗!非常感谢。现在我正在尝试向awk命令添加更多条件。我已经完成了
awk'/Completed/{counter+=1}Finished/{if(counter=1)mornCount+=1 if(counter=2)afterCount+=1,if(counter=3)nightCounter+=1}结束{print morn,after,and night counters}谢谢你的澄清。还有使用grep的聪明方法。哦,我没听清楚!谢谢
grep -v "Completed" file.txt | grep -c "Script Finished"
while read line; do
case "$line" in
*"Completed"*)break;;
*"Script Finished"*)count=$((count + 1));;
esac
done < file.txt