unix 如何等待文件中出现特定行

bpzcxfmw  于 2023-02-04  发布在  Unix
关注(0)|答案(4)|浏览(252)

有没有可能编写一个脚本,直到给定的行出现在特定的文件中才继续?
例如,我想做这样的事情:

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

echo 'Waiting for server to start'
.... watch $FILE for $CANARY_LINE ...
echo 'Server started'

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

bvn4nwqk

bvn4nwqk1#

tail -n0 -f path_to_my_log_file.log | sed '/particular_line/ q'
fxnxkyjh

fxnxkyjh2#

您可以在通过sed解析输入时使用q标志。这样,一旦Server started出现在/var/logs/deployment.log中,sed就会中断tail

tail -f /var/logs/deployment.log | sed '/Server started/ q'

做同样事情的另一种方法

( tail -f -n0 /var/logs/deployment.log & ) | grep -q "Server Started"

上一个答案(有效,但不如此答案有效)
我们必须小心循环。
例如,如果你想检查一个文件来启动一个算法,你可能必须做这样的事情:

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

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

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
dxpyg8gm

dxpyg8gm3#

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

echo 'Waiting for server to start'
grep -q $CANARY_LINE <(tail -f $FILE)
echo 'Server started'

来源:改编自How to wait for message to appear in log in shell

mzmfm0qo

mzmfm0qo4#

试试这个:

#!/bin/bash

canary_line='Server started'
file='/var/logs/deployment.log'

echo 'Waiting for server to start'

until grep -q "${canary_line}" "${file}"
do
  sleep 1s
done

echo 'Server started'

根据您的口味调整sleep的参数。
如果文件中的行需要 * exactly * 匹配,即整行,则将grep的第二个参数更改为"^${canary_line}$"

  • 如果 * 该行包含任何grep认为特殊的字符,您将不得不以某种方式解决该问题。

相关问题