Bash 超时后终止tail命令

Bash 超时后终止tail命令,bash,shell,Bash,Shell,我正在使用tail-f file\u name在文件中捕获标准输出(日志),以使用grep和sed保存特定字符串(以退出尾部): 这可以正常工作,但我想终止该命令,以防它在一段时间后在日志文件中找不到模式(INFO) 我想在超时(60秒)后退出脚本,类似这样的操作(不起作用): 有什么建议吗?因为您只想捕获一行: #!/bin/bash IFS= read -r -t 60 line < <(tail -f log.txt | awk '/INFO/ { print; exit; }

我正在使用
tail-f file\u name
在文件中捕获标准输出(日志),以使用
grep
sed
保存特定字符串(以退出尾部):

这可以正常工作,但我想终止该命令,以防它在一段时间后在日志文件中找不到模式(
INFO

我想在超时(60秒)后退出脚本,类似这样的操作(不起作用):


有什么建议吗?

因为您只想捕获一行:

#!/bin/bash
IFS= read -r -t 60 line < <(tail -f log.txt | awk '/INFO/ { print; exit; }')
printf '%s\n' "$line" >info_file.txt

请注意:

  • SECONDS
    是bash中的一个内置变量,读取该变量时,将检索自shell启动以来的时间(以秒为单位)。(在成为任何赋值的目标后,它将失去这种行为——避免此类错误是为什么保留小写字符的名称供应用程序使用是有价值的一部分)
  • (())
    创建一个算术上下文;其中的所有内容都被视为整数数学

  • 因为您只想捕获一行:

    #!/bin/bash
    IFS= read -r -t 60 line < <(tail -f log.txt | awk '/INFO/ { print; exit; }')
    printf '%s\n' "$line" >info_file.txt
    

    请注意:

    • SECONDS
      是bash中的一个内置变量,读取该变量时,将检索自shell启动以来的时间(以秒为单位)。(在成为任何赋值的目标后,它将失去这种行为——避免此类错误是为什么保留小写字符的名称供应用程序使用是有价值的一部分)
    • (())
      创建一个算术上下文;其中的所有内容都被视为整数数学

    • 这似乎对我有用

      read -t 60 < <(tail -f log.txt | sed /'INFO'/q | grep 'INFO')
      

      read-t60<这似乎适合我

      read -t 60 < <(tail -f log.txt | sed /'INFO'/q | grep 'INFO')
      
      read-t60<这个命令(Debian/Ubuntu“coreutils”包的一部分)似乎很合适:

      timeout 1m tail -f log.txt | grep 'INFO' 
      
      这个命令(Debian/Ubuntu“coreutils”包的一部分)似乎很合适:

      timeout 1m tail -f log.txt | grep 'INFO' 
      

      注意……顺便说一下,我会考虑使用<代码> AWK <代码>代替<代码> GRP <代码> SED逻辑,因为它可以做这两个工作。实际上,也许更相关。不需要<代码> SED…<代码> >代码> > GRP单独执行。注意…BTW,我将考虑使用<代码> AWK <代码>代替<代码> GRP <代码> SED逻辑,因为它可以做这两者的工作。实际上,也许更相关。不需要<代码> SED…
      ,只需
      grep
      即可。nod。导入
      read
      是OP最直接的问题(尽管我不知道他们为什么要为运行
      sed
      grep
      的开销而烦恼;你可以让
      sed
      完成所有的工作,或者——我的偏好——只是委托给
      awk
      )。顺便问一句,
      -color=auto
      在这里有价值吗?如果有一个函数或别名设置--color=always
      ,它在脚本中不应该是活动的,而且(当然)它限制了对GNU
      grep
      @CharlesDuffy的可移植性,我想我需要担心缓冲,但事实似乎并非如此。对,因为缓冲区在退出时被刷新。如果您捕获了多个
      信息
      行,但在第一行之后退出会“免费”刷新,@CharlesDuffy不知道
      --color=always
      从何而来,肯定是我的终端窗口的复制/粘贴问题,我没有手动添加。nod。导入
      read
      是OP最直接的问题(尽管我不知道他们为什么要为运行
      sed
      grep
      的开销而烦恼;你可以让
      sed
      完成所有的工作,或者——我的偏好——只是委托给
      awk
      )。顺便问一句,
      -color=auto
      在这里有价值吗?如果有一个函数或别名设置--color=always
      ,它在脚本中不应该是活动的,而且(当然)它限制了对GNU
      grep
      @CharlesDuffy的可移植性,我想我需要担心缓冲,但事实似乎并非如此。对,因为缓冲区在退出时被刷新。如果您捕获了多个
      信息
      行,但在第一行之后退出会“免费”刷新,@CharlesDuffy不知道
      --color=always
      从何而来,肯定是我的终端窗口的复制/粘贴问题,我没有手动添加它。