2016-04-05 10 views
0

シェルスクリプトの初心者です。私は脚本をしようとしています。シェルスクリプトでファイルを読む方法

私は毎分データを保存するログファイルを持っています。キーワードが存在する場合、スクリプトはそのログファイル内のキーワードを検出する必要があります。

私は以下のようにしようとしていた:

read jeeva/sample/logs.txt 
grep keyword 

私は私のスクリプトは、ばかげている知っています。これで私を助けてください。

+0

一般に、 'grepキーワードファイル名'は、ファイルを検索するための受け入れられたパターンです。あなたは毎分これをやっているので、 'tail -f file | grepキーワード 'を使用していますが、これは脆弱な解決策であり、cmd-lineの使用にのみ適しています。この問題を解決するために設計されたユーティリティ、おそらく 'ウォッチャー '(実際に現れるすべてのコーナーケースをカバーするのは簡単な問題ではありません)を探してください。いくつかのアイデアについては、ここで '' bash 'watch' 'を検索してください。がんばろう。 – shellter

+0

@shellter - 'tail -f'(または少なくとも' tail -F')が非常に壊れやすいとは思えません。私は問題解決なしで何年も走ってきたことに基づいて、良い答えを得ている間に[解決策](http://stackoverflow.com/a/10958125/1072112)を提供しました。 – ghoti

+0

@ghoti。うん、私は "壊れやすいかもしれない"と言っていたはずです。私はあなたの答えを確認してください! Tnx! – shellter

答えて

2

です-qオプションは、キーワードが見つかると出力を抑制するオプションです。

2

これは、変数

some_var=$(cat jeeva/sample/logs.txt) 

にファイルを読み込みます。しかし、あなたはそれをする必要はありません。それは、その後$?がそうでなければ、それは1に等しくなり、0に等しくなります発見された場合にのみ、ちょうど

grep keyword jeeva/sample/logs.txt 

スクリプトにすることができますので、単語「キーワード」をチェックします。

だから、あなたが行うことができます:私はあなただけで、いくつかのタグ付けされたログメッセージを監視する必要があると思います

grep keyword jeeva/sample/logs.txt 
if ! [[ $? ]] 
then 
    echo found 
else 
    echo "not found" 
fi 
+1

'$? 'を使うのはここの反パターンです。 'grep keyword jeeva/sample/logs.txt;を実行するだけで'その後 ' – cmh

1

。 方法について:

tail -fn 1000 youFile.log | grep yourTag 

テールは、あなたがそれを再実行する必要はありませんので、この場合には、より良いと思われます。

スクリプトが必要な場合は、このいずれかを試してみてください。

#!/bin/bash 

while IFS='' read -r line || [[ -n "$line" ]]; do 
    if [[ $line == *"$2"* ]]; then 
     echo "Do sth here."; 
     echo "Like - I've found: $line"; 
    fi 
done < "$1" 

$ 1ファイル $ 2、あなたのタグは、おそらくあなたは、このよう

$ if grep -q keyword jeeva/sample/logs.txt; 
    then echo "found"; 
    else echo "not found"; 
    fi 

それを書きたい

➜ generated ./script.sh ~/apps/apache-tomcat-7.0.67/RUNNING.txt UNIX 
Do sth here. 
Like - I've found:  access to bind under UNIX.