文字列に一致するファイルの最後の行を探しますか? [閉鎖]

文字列に一致するファイルの最後の行を探しますか? [閉鎖]

ファイル内で無限に実行されるループが必要ですが、常に最後の行に一致する文字列が含まれていることを確認し、一致する文字列がある場合はその行をエコーし​​てループを実行し続けます。今持っているのはうまくいきません。 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)

関連情報