文字列の一部のみ Grep

文字列の一部のみ Grep

ファイルがあります。ファイルには次の文字列が含まれています。

sdnfasdnbfas;jdfnba;ldjfnb;asdf[MESG: I NEED THIS: 1] adsfasdfasdfasdfasdf
sdnfasdnbfas;jdfnba;ldjfnb;asdf[MESG: I NEED THIS: 2] adsfasdfasdfasdfasdf
sdnfasdnbfas;jdfnba;ldjfnb;asdf[MESG: I NEED THIS: 3] adsfasdfasdfasdfasdf

「grep」を使用して次のような出力を取得するにはどうすればよいですか?

MESG: I NEED THIS: 1
MESG: I NEED THIS: 2
MESG: I NEED THIS: 3

答え1

正規表現を読む:

$ echo 'sdnfasdnbfas;jdfnba;ldjfnb;asdf[MESG: I NEED THIS: 1] adsfasdfasdfasdfasdf' | grep -Eo '\[.*\]'
[MESG: I NEED THIS: 1]
$ 

答え2

見ているこの質問に対するあなたの答え、提案は次のとおりです。

for number in 1 2 3; do
    string="[MESG: I NEED THIS: $number]"

    if grep -qF "$string" /don/key; then
        printf 'Matched %d\n' "$number"
    else
        printf 'Did not match %d\n' "$number"
    fi
done

(正規表現ではなく)固定文字列を一致させるには、-Fwithを使用する必要がありますgrep。使用しない場合は、正規表現(および-Fこの場合)のすべての特殊文字をエスケープする必要があります。[]

出力の生成を停止します-qgrep私たちは出力に興味がなく、一致する出力にのみ興味があります。

正規表現は[MESG: I NEED THIS: 1]文字セット内で正確に1つの文字と一致しますが[...]、これは必要なものとは異なります。

答え3

早く助けてくれてありがとう。残念ながら、-ashを実行しているので、小さな回避策が必要です。以下を実行して問題を解決しました。

grep -o "\w*[MESG: I NEED THIS: 1]\w*" 

今私は社会に何かを返したい。小さな問題を解決しましたので、いくつかの文字列の後に特定のファイルを観察し、それに応じてアクションをとる一般的なスクリプトを共有します。

## This is a generic script to monitor a file for multiple strings and
## act accordingly. 
while true                                                                                                                                      
do                                                                                                                                              
grep -o "\w*[MESG: I NEED THIS: 1]\w*" /don/key | grep '[MESG: I NEED THIS: 1]' &> /dev/null                                                                    
        if [ $? == 0 ];                                                                                                                         
                then                                                                                                                            
                        echo "matched 1"                                                                                                                 
                else                                                                                                                            
                        echo "not matched 1"                                                                                                    
fi                                                                                                                                              
grep -o "\w*[MESG: I NEED THIS: 2]\w*" /don/key | grep '[MESG: I NEED THIS: 2]' &> /dev/null                                                                    
        if [ $? == 0 ];                                                                                                                         
                then                                                                                                                            
                        echo "matched 2"                                                                                                           
                else                                                                                                                            
                        echo "not matched 2"                                                                                                    
fi                                                                                                                                              

grep -o "\w*[MESG: I NEED THIS: 3]\w*" /don/key | grep '[MESG: I NEED THIS: 3]' &> /dev/null                                                                    
        if [ $? == 0 ];                                                                                                                         
                then                                                                                                                            
                 echo "matched 3"                                                                                                                   
                else                                                                                                                            
                 echo "not matched 3"                                                                                                            
fi                                                                                                                                              

sleep 3                                                                                                                                         

done   

関連情報