如何等到特定行出现在文件中

pat*_*rit 7 unix bash shell

是否可以编写在特定文件中出现给定行之前不会继续的脚本?

例如,我想做这样的事情:

CANARY_LINE='Server started'
FILE='/var/logs/deployment.log'

echo 'Waiting for server to start'
.... watch $FILE for $CANARY_LINE ...
echo 'Server started'
Run Code Online (Sandbox Code Playgroud)

基本上,一个 shell 脚本,它监视文件的行(或正则表达式)。

小智 19

tail -f path_to_my_log_file.log | sed '/particular_line/ q'
Run Code Online (Sandbox Code Playgroud)

  • 我无法让它发挥作用。在“sed”与正则表达式匹配后,“tail”继续执行。对我来说,这有效:https://superuser.com/questions/270529/monitoring-a-file-until-a-string-is-found (2认同)

Xav*_* S. 6

q您可以在通过 解析输入时使用该标志sed。然后一旦出现sed就会中断。tailServer started/var/logs/deployment.log

  tail -f /var/logs/deployment.log | sed '/Server started/ q'
Run Code Online (Sandbox Code Playgroud)

做同样事情的另一种方法

  ( tail -f -n0 /var/logs/deployment.log & ) | grep -q "Server Started"
Run Code Online (Sandbox Code Playgroud)

上一个答案(有效,但不如这个有效)

我们必须小心循环。

例如,如果您想检查文件以启动算法,您可能必须执行类似的操作:

  FILE_TO_CHECK="/var/logs/deployment.log"
  LINE_TO_CONTAIN="Server started"
  SLEEP_TIME=10
  while [ $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") ]
  do
      sleep ${SLEEP_TIME}
  done

  # Start your algorithm here
Run Code Online (Sandbox Code Playgroud)

但是,为了防止无限循环,您应该添加一些界限:

  FILE_TO_CHECK="/var/logs/deployment.log"
  LINE_TO_CONTAIN="Server started"
  SLEEP_TIME=10
  COUNT=0
  MAX=10
  while [ $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") -a ${COUNT} -lt ${MAX} ]
  do
      sleep ${SLEEP_TIME}
      COUNT=$(($COUNT + 1))
  done

  if [ ! $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") ]
  then
    echo "Let's go, the file is containing what we want"
    # Start your algorithm here
  else
    echo "Timed out"
    exit 10
  fi
Run Code Online (Sandbox Code Playgroud)