我有一个文件。该文件包含类似的字符串
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
请注意,如果要匹配固定字符串(而不是正则表达式),则应该使用-F
with 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