ファイルがあります。ファイルには次の文字列が含まれています。
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]
文字セット内で正確に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