ファイル内で無限に実行されるループが必要ですが、常に最後の行に一致する文字列が含まれていることを確認し、一致する文字列がある場合はその行をエコーしてループを実行し続けます。今持っているのはうまくいきません。 grepエラーが発生します。
#! /bin/bash
echo "Script is starting......."
FILE="/Users/shubhamsinha/Desktop/new_test.log"
# (tail -n1) < FILE
STRING="MYNAME"
while : ;do
Last = tail -F "$FILE"
grep -q "$STRING" "$Last" && echo "FOUND" && break
sleep 5
done
答え1
スクリプトの作成を気にしないでください。これにはスクリプトではなく行が必要です。
新しいツールを作成するのではなく、既存のツールを活用して必要な作業を実行してください。
コマンドラインに次のように入力します。
tail -f -n 1 /Users/shubhamsinha/Desktop/new_test.log | grep MYNAME
説明する:
tail -f
指定されたファイルで永久に実行され、ファイルに追加された各追加行を出力します。
-n 1
つまり、tail
起動時にファイルのデフォルトの最後の10行ではなく、現在のファイルの最後の行のみが出力されます。
|
パイプラインだ。パイプを理解していない場合は、すべてを捨ててパイプを理解するまで、より多くのシェルスクリプトを作成しないでください。 (長い時間はかかりませんが、批判的良いスクリプトを書いてください。 )
grep MYNAME
入力にMYNAMEパターンを含む行のみを印刷します。
答え2
#! /bin/bash
echo "Script is starting......."
FILE="/Users/shubhamsinha/Desktop/new_test.log"
STRING="MYNAME"
while true; do
tail bar | grep "MYNAME" && echo "FOUND" && break
sleep 5
done
はい
FILE="/home/user1/tmp/bar"
スクリプト名は
foo
% ./foo & [1] 12586 Script is starting....... % echo "MYNAME" > ~/tmp/bar % MYNAME FOUND [1] + 12586 done ./foo
答え3
tail
そのコマンドを使用するのではなく、完全な出力awk
を得るために使用します。
Last = tail -F "$FILE" ===> Last=$(awk '/./{line=$0} END{print line}' $FILE)