Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 逐行读取文本文件并检查该行是否有特定字符串_Linux_Shell_Unix_Scripting - Fatal编程技术网

Linux 逐行读取文本文件并检查该行是否有特定字符串

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

我正在尝试使用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
读取行时
做
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