파일에서 특정 줄과 일치하는 줄이 발견되면 Bash 스크립트를 종료합니다(tail -f filename.log).

파일에서 특정 줄과 일치하는 줄이 발견되면 Bash 스크립트를 종료합니다(tail -f filename.log).

tail -f filename.log파일에서 다음 줄 중 하나와 일치하는 줄을 발견하면 종료하도록 bash 스크립트를 작성하는 방법

Abaqus JOB filename COMPLETED

Abaqus/Analysis exited with errors

Ctrl+ Cexit를 사용하는 것이 가능하다는 것을 알고 있지만 tail -f이 작업을 수행하는 자동화된 방법을 찾고 있습니다.

어떤 도움이라도 대단히 감사하겠습니다.

답변1

tail -f filename.log | sed '/Abaqus JOB filename COMPLETED/q'

"이게 왜 필요한가"에 대해서는 상상력이 부족한 사람들에게 어필할 수 있습니다. 스크롤 속도가 너무 빠르기 때문에 놓칠 수 있기 때문입니다. 하지만 여전히 진행 상황을 확인하고 싶습니다. 그리고 당신은 여전히 ​​그것의 뒷부분이 화면에 나타나기를 원합니다.

답변2

#!/bin/bash

p1="Abaqus/Analysis exited with errors"
p2="Abaqus JOB filename COMPLETED"

if tail /tmp/filename.log | grep -we "$p1" -we "$p2" > /dev/null 2>&1; then
    echo "pattern found"
    # ....do somenthing - what you need to do....
else
    echo "pattern not found"
fi

무한 루프:

while true; do
    if tail /tmp/filename.log | grep -we "$p1" -we "$p2" > /dev/null 2>&1; then 
       echo "pattern found !"
       # ....do something here....
       break
    fi
    sleep 1
done

답변3

sh -c 'echo "$$"; exec tail -f filename.log' | (
  IFS= read -r pid &&
    sed '/^Abaqus JOB filename COMPLETED$/q
         /^Abaqus\/Analysis exited with errors$/q' &&
    kill -s PIPE "$pid"
)

방금 이 작업을 수행한 경우 이러한 줄 중 하나라도 보이면 종료하지만 tail -f file.log | sed ...q나중에 파이프에 무엇이든 쓴 경우에만 종료(SIGPIPE에 의해 종료됨)됩니다 sed. 로깅 프로세스가 종료되어 로그 파일이 업데이트되지 않으면 이런 일이 발생하지 않습니다.qtail

따라서 여기서는 SIGPIPE를 수동으로 보냅니다(일부 쉘에서는 원치 않는 진단 메시지가 인쇄되도록 하는 SIGTERM 대신). 처음부터 파이프의 오른쪽에 shpid tail(재사용된 pid sh) 를 전달 하는 데 사용됩니다 .exec

동등한 perl:

sh -c 'echo "$$"; exec tail -f filename.log' | perl -lne '
  BEGIN {$pid = <> or die "No pid."}
  print;
  if ($_ eq "Abaqus JOB filename COMPLETED" ||
      $_ eq "Abaqus/Analysis exited with errors") {
    kill "PIPE", $pid;
    last;
  }'

관련 정보