仅 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]与 内的一组字符中的一个字符完全匹配[...],这不是您想要的。

答案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   

相关内容