web-dev-qa-db-ja.com

Bashスクリプト-ファイルに特定の行が含まれているかどうかを確認する

ファイルに特定の行が含まれているかどうかを確認する必要があります。このファイルは継続的に誰かによって書き込まれるため、whileループ内にチェックを入れます。

FILE="/Users/test/my.out"
STRING="MYNAME"
EXIT=1
while [ $EXIT -ne 0 ]; do 
    if [ -f $FILE ] ; then CHECK IF THE "STRING" IS IN THE FILE - IF YES echo "FOUND"; EXIT=0; fi
done

ファイルにはテキストと複数行が含まれています。

15
user3472065

$FILEにファイル名が含まれ、$STRINGに検索対象の文字列が含まれる場合、次のコマンドを使用してファイルが一致するかどうかを表示できます。

if [ ! -z $(grep "$STRING" "$FILE") ]; then echo "FOUND"; fi
13
fstab

文字列が変更されたときに、ファイルの変更時刻とgrepをポーリングします。

while :; do
    a=$(stat -c%Y "$FILE") # GNU stat
    [ "$b" != "$a" ] && b="$a" && \
        grep -q "$STRING" "$FILE" && echo FOUND
    sleep 1
done

注:BSDユーザーはstat -f%mを使用する必要があります

6
Cole Tierney

試してください:

while : ;do
    [[ -f "$FILE" ]] && grep -q "$STRING" "$FILE" && echo "FOUND" && break
done

これは待機せずに継続的にループします。待機時間(この例では5秒)を追加することができます。

while : ;do
    [[ -f "$FILE" ]] && grep -q "$STRING" "$FILE" && echo "FOUND" && break
    sleep 5
done
4
Josh Jolly

与えられたline $ STRINGがファイルFILEに含まれているかどうかをテストするためのより厳密なチェックは、

awk '$0 == "'${STRING}'"' $FILE

これは特に、@ fstabの回答に関する私の懸念に対処します(これは、他のすべての以前の回答にも当てはまります):(上記のgrepソリューションで行われたように)行内の部分文字列の存在だけでなく、完全な行をチェックします。

ループは、他の回答に示されているように実行できます。

2
Holger Brandl