Bash Grep输出多行,需要while循环

Bash Grep输出多行,需要while循环,bash,Bash,我有一个脚本,它使用grep查找文本文件中的行(具体来说是ics日历) 我的脚本找到一个日期匹配项,然后上下移动几行,将约会的摘要和开始时间复制到一个单独的变量中。我遇到的问题是,我将同时有多个约会,我需要在grep中为每个结果运行整个过程 例如: LINE=`grep -F -n 20130304T232200 /path/to/calendar.ics | cut -f1 d:` 它只输出行,例如 86 89 然后它继续捕获我的其他变量,例如: SUMMARYLINE=$(( $LINE

我有一个脚本,它使用grep查找文本文件中的行(具体来说是ics日历)

我的脚本找到一个日期匹配项,然后上下移动几行,将约会的摘要和开始时间复制到一个单独的变量中。我遇到的问题是,我将同时有多个约会,我需要在grep中为每个结果运行整个过程

例如:

LINE=`grep -F -n 20130304T232200 /path/to/calendar.ics | cut -f1 d:`
它只输出行,例如 86 89

然后它继续捕获我的其他变量,例如:

SUMMARYLINE=$(( $LINE + 5 ))
SUMMARY:`sed -n "$SUMMARYLINE"p /path/to/calendar.ics 

我的脚本只需要一个输出就可以正常运行,但显然不能使用超过1个的输出,我需要这样做。我应该将grep结果发送到数组中吗?要从中读取的单独文本文件?我想我需要一段时间的循环。需要帮助。

您可以很容易地从循环中调用
grep

while IFS=':' read -r LINE notused   # avoids the use of cut
do
    # First field is now in $LINE
    # Further processing

done < <(grep -F -n 20130304T232200 /path/to/calendar.ics)
而IFS=':'read-r LINE notused#避免使用cut
做
#第一个字段现在在$LINE中
#深加工

使用建议的解决方案完成后,您将对该文件进行多次阅读。使用awk,您可以一次完成:

awk -F: -v time=20130304T232200 '
    $1 == "SUMMARY" {summary = substr($0,9)} 
    /^DTSTART/ {start = $2}
    /^END:VEVENT/ && start == time {print summary} 
' calendar.ics

您可能想要
,而IFS=:read-r LINE notused
(在一行上)而不是
,因为
是的,这样更好(打字)。谢谢您的回复。请帮助我更好地理解你的例子。“不使用”有什么用?当我尝试运行这个循环时,shell告诉我“语法错误,意外完成”-我添加了一些进一步的处理,它在最后一行告诉我“重定向意外”@user2134314:
notused
变量将保存第一行之后的所有字段,该字段围绕IFS值拆分。如果我们想要每个字段,那么每个字段都可以有一个变量。语法错误表明您可能没有使用Bash,请检查#!谢谢,是的,我用错了外壳。但我现在有另一个问题。按照现在的方式编写脚本(基本上是您的简化版本),它只是空着坐在那里,什么也不做。但是,如果它从grep创建的文本文件中读取,它就可以工作。例如:
while read-r line do echo“line现在是”$line sleep 5;完成<“results.log”
起作用,但
完成
就坐在那里谢谢您的回复。我从未使用过awk,但它似乎是一个优雅的解决方案。我将首先尝试使用常规的shell脚本,因为我对它比较熟悉