문자열의 일부만 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이 경우 )의 모든 특수 문자를 이스케이프해야 합니다.[]

출력 생성을 중지합니다 -q. grep우리는 출력에는 관심이 없고 일치하는 출력에만 관심이 있습니다.

정규식은 [MESG: I NEED THIS: 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   

관련 정보