파일이 있습니다. 파일에는 다음과 같은 문자열이 포함되어 있습니다.
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