ファイルに特定の行と一致する行が見つかったら、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;
  }'

関連情報