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
。ログ処理が終了してログファイルが更新されない場合、これは発生しません。q
tail
したがって、ここではSIGPIPEを手動で送信します(一部のシェルでは不要な診断メッセージを印刷するSIGTERMの代わりに)。最初からパイプの右側にsh
pid 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;
}'