Grep은 줄의 시작이나 중간에서 패턴을 찾습니다.

Grep은 줄의 시작이나 중간에서 패턴을 찾습니다.

이 질문이 들리는 것만큼 순진하지 않다고 생각한다는 점부터 시작하겠습니다.

해야 할 일: 폴더의 PATH 환경 변수를 확인하세요. 처음에 있을 수도 있고 나중에 있을 수도 있습니다. 폴더가 존재하는지 확인하면 됩니다.

내 질문의 예 - 를 사용해 보겠습니다 /opt/gnome.


시나리오 1: 폴더가 PATH의 시작 부분에 없습니다.

# echo "$PATH"
/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome

# echo "$PATH" | grep ":/opt/gnome"
/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome

/var/opt/gnomegrep은 콜론을 포착하지 않도록 충분히 구체적이어야 합니다 .


시나리오 2: 폴더가 PATH의 시작 부분에 있습니다.

# echo "$PATH"
/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome

# echo "$PATH" | grep "^/opt/gnome"
/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome

내 문제는 다음과 같습니다. 이 폴더에서 콜론이나 줄 시작 부분을 검색해야 합니다. 내가 하고 싶은 것은 다음 두 가지 대괄호 표현식 중 하나입니다.

# echo $PATH | grep "[^:]/opt/gnome"
# echo $PATH | grep "[:^]/opt/gnome"

하지만[^그리고 [:그 자체의 의미가 있습니다.따라서 위의 두 명령은 작동하지 않습니다.

하나의 명령으로 두 경우 모두를 grep하는 방법이 있습니까?

답변1

PATH파일에서 무언가를 찾는 대신 환경 변수의 내용을 확인하는 경우 이는 grep잘못된 도구입니다. 셸에서 이 작업을 수행하는 것이 더 쉽고(더 빠르며, 아마도 더 읽기 쉽습니다).

Bash, ksh 및 zsh에서:

if [[ :$PATH: = *:/opt/gnome:* ]]; then
 : # already there
else
  PATH=$PATH:/opt/gnome
fi

가지고 다닐 수 있는:

case :$PATH: in
  *:/opt/gnome:*) :;; # already there
  *) PATH=$PATH:/opt/gnome;;
esac

:$PATH:; 대신 ; 를 사용하십시오 $PATH. 이렇게 하면 구성 요소가 의 시작이나 끝에 있더라도 검색 문자열에서 항상 콜론으로 묶입니다 $PATH.

파일의 한 줄을 검색하는 경우 확장 정규식(예: require grep -E) 을 사용하여 (^|:)/opt/gnome($|:)일치시킬 수 있지만 /opt/gnome, 줄의 시작 부분이나 콜론 뒤에 있는 경우, 그리고 줄의 끝 부분에 있는 경우에만 가능합니다. 그 뒤에는 콜론이 옵니다.

답변2

다음을 사용하여 정규식을 확장할 수 있습니다.grep -E

오탐을 방지하려면 찾고 있는 경로의 시작과 끝을 일치시켜야 합니다.

시작 부분과 일치하는 예:

$ TEST=/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome
$ echo $TEST | grep -E "(:|^)/opt/gnome(:|$)"
/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome

중간 인스턴스와도 일치합니다.

$ TEST=/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome
$ echo $TEST | grep -E "(:|^)/opt/gnome(:|$)"
/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome

거짓 긍정 방지:

$ TEST="/home/bob/opt/gnome:/opt/gnome/somethingelse:/opt/gnome-beta"
$ echo $TEST | grep -E "(:|^)/opt/gnome(:|$)"

거기에는 일치하는 항목이 없습니다.

컴팩트하고 우아합니다. 데비안 7에서 테스트되었습니다.

답변3

미혼인 경우에는 다음의 기록을 grep사용하고 분리할 수 있습니다 .awk:

awk 'BEGIN {RS=":"} /^\/opt\/gnome$/'

답변4

답변이 충분할지 모르겠지만

grep -w "/opt/gnome"

귀하의 요구를 충족시킬 것입니다.

echo '/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome' | grep -w "/opt/gnome" -o
/opt/gnome
echo '/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome' | grep -w "/opt/gnome" -o
/opt/gnome

하지만

echo '/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome' | grep "/opt/gnome" -o
/opt/gnome
/opt/gnome

관련 정보