"grep" 명령 이해, 예상과 다른 결과 표시 [닫기]

"grep" 명령 이해, 예상과 다른 결과 표시 [닫기]

저는 Unix를 처음 접하고 디렉터리(디렉터리 제외)의 모든 파일을 표시하려고 했기 때문에 ls -p | grep -v /.

다음과 같은 목록이 표시됩니다.

Process1
Process2 
Process3

하지만 명령을 사용하면 ls -p | grep -v / | grep P*일부 프로세스만 표시됩니다. 모든 프로세스를 표시하지 않는 이유는 무엇입니까?

편집하다

나는 소문자 p 대신 대문자 P를 사용하고 있다는 것을 깨달았습니다. 이것은 실수입니다.

답변1

두 번째 명령에서는 grep P*셸에 일치하는 파일 이름을 묻는 메시지가 표시됩니다. 즉, 해당 문자로 시작하는 모든 파일로 P*확장됩니다 .P*P

set -x실행된 내용을 확인하기 위해 쉘에서 사용됩니다(추적을 끈 상태에서 set +x).실제로는 내가 무엇을 하고 있는지 확인하기 위해 대화형 셸 세션에서 기본적으로 추적이 켜져 있습니다..

큰따옴표만으로는 P*이 문제를 해결할 수 없습니다.정규식 P*또한 및 같은 파일 이름 APPLEfile.PP실제로 hello_world.c다른 모든 파일 이름과 일치 P*하며 파일 이름과도 일치합니다.아니요 P바로 거기.

일반적으로 말하면,출력을 구문 분석하면 안 됩니다.ls그러나 다음은 문자로 시작하는 파일 목록(디렉토리가 아닌)을 얻는 더 좋은 방법입니다 P.

$ find . -type f -maxdepth 1 -name "P*"

-type f현재 디렉터리( ) .에서 이름이 P( )로 -name "P*"시작하는 모든 일반 파일( )을 찾습니다 . 이 옵션은 이 디렉터리로 -maxdepth 1제한됩니다 . find그렇지 않으면 하위 디렉터리에도 반복됩니다.

find당신이하고있는 일을 하십시오 grep -v /.제거하다대신 목록의 디렉토리선택하다일반 파일:

$ find . ! -type d -maxdepth 1 -name "P*"

소켓 등과 같은 비정규 파일도 찾습니다. 일부 쉘에서는 이스케이프 또는 인용이 필요합니다 !. 즉,

$ find . "!" -type d -maxdepth 1 -name "P*"

또는

$ find . \! -type d -maxdepth 1 -name "P*"

P*쉘이 확장하지 않도록 인용은 중요합니다.

답변2

이것"P*"뭔가와 일치할 것입니다(또는아니요) grep이 매개변수를 보기 전에 쉘에서. 인용하면 더 나은 결과를 얻을 수 있지만 grep은 와일드카드가 아닌 정규식과 일치한다는 점을 기억하십시오.

따라서 "P"만 입력하면 됩니다. 정규식이므로 *다음 문자를 허용하기 위해 별표가 필요하지 않습니다."P"일치시키려면(grep은 기본적으로 이를 무시합니다):

ls -p | grep -v / | grep "P"

또는

ls -p | grep -v / | grep '^P'

변경된 질문에 대해 후속 조치를 취하고 대소문자를 무시하려면 -igrep 옵션을 사용하십시오.

ls -p | grep -v / | grep -i '^P'

추가 자료:

관련 정보