grep을 사용하여 "c"로 시작하지 않는 항목을 나열하는 방법

grep을 사용하여 "c"로 시작하지 않는 항목을 나열하는 방법

내 컴퓨터 공학 수업 중 선생님이 우리에게 사용자 파일을 주었습니다. users.txt이 파일의 줄은 다음과 같습니다.

$ head users.txt

root:x:0:0:root:/root:/bin/bash
apache:x:71:71:system user for apache2:/var/www:/bin/sh
ftp:x:73:73:system user for proftpd:/var/ftp:/bin/false
c0407115:x:1501:1000:Alberto Damiao Canelas Fraga:/home/c0407115:/bin/bash
c0407165:x:1502:1000:Alexandre Viriato Morais Magalhaes:/home/c0407165:/bin/bash
c0407110:x:1503:1000:Alvaro Manuel Figueiredo Nunes de Sousa:/home/c0407110:/bin/bash
c0307009:x:1504:1000:Ana Marta Tavares Laranjeira:/home/c0307009:/bin/bash
c0416079:x:1505:1000:Ana Rita Caetano Mourato:/home/c0416079:/bin/bash
c0407137:x:1506:1000:André Brito Coimbra:/home/c0407137:/bin/bash
c0307068:x:1507:1000:André Filipe Rios da Fonseca Alves Modesto:/home/c0307068:/bin/bash

그러자 선생님은 다음과 같은 부탁을 하셨습니다.

학생이 아닌 모든 사용자를 나열하는 명령을 작성합니다(즉, 로그인 이름이 c??로 시작하지 않음).

내 첫 번째 방법은 다음과 같습니다.

$ cat users.txt | grep [^c]*

grep: figures: Is a directory
grep: practice: Is a directory

작업 중인 디렉터리 내의 특정 디렉터리와 관련된 오류 메시지가 나타납니다. 내 디렉터리에 있는 현재 파일은 다음과 같습니다.

$ ls

archive  figures  practice  users.txt

그런 다음 역방향 일치 옵션을 사용하여 반대 작업을 시도했습니다.

$ cat users.txt | grep -v [c]*
$

하지만 이번에는 아무런 결과도 얻지 못했습니다. 이것이 작동하지 않는 이유는 무엇이며 오류 메시지가 나타나는 이유는 무엇이며 어떻게 해야 합니까? 감사해요

답변1

... | grep [^c]*

여기에는 다음 [^c]*과 유사한 파일 이름 패턴인 glob이 있습니다 .*.txt

[^c]의미는 정규식과 동일합니다. 즉, 가 아닌 모든 단일 문자와 일치합니다 c. 정규식과 달리 *전역적으로 모든 문자 수와 일치합니다. 따라서 전체 콘텐츠는 로 시작하지 않는 모든 파일 이름과 일치하고 확장됩니다 c(예: all ) archive figures practice users.txt.

-eor -f옵션 없이 인수 목록이 주어지면 grep첫 번째 인수가 패턴으로 사용되므로 명령은 archive나머지 파일에서 해당 문자열을 찾습니다. grep디렉터리는 기본적으로 처리되지 않으므로 이러한 오류가 발생합니다.

grep패턴에 쉘 특정 문자가 포함된 경우 패턴이 변경되지 않도록 인용 부호로 묶어야 합니다. 또는 안전을 위해 특수 문자가 있는 경우 패턴을 인용하세요.


정규식으로서 는 가 [^c]*아닌 연속 문자 수와 일치합니다 c. 그러나 여기에는 길이가 0인 일치가 포함되므로 grep '[^c]*'모든 줄이 일치됩니다.

패턴을 줄 시작 부분에 고정하고 최소한 하나의 문자가 필요하도록 만들어야 합니다.

이것은 숙제이므로 다음 명령을 시도해보고 그들이 왜 그런 일을 하는지 알아낼 수 있는지 알아보세요.

grep        c   users.txt
grep -v     c   users.txt
grep       ^c   users.txt
grep -v    ^c   users.txt
grep    '^[^c]' users.txt
grep -v '^[^c]' users.txt

( [c]just 와 동일 c하므로 생략하겠습니다. ^실제로 쉘 자체에 특별한 것이 아니므로 여기서 참조할 필요가 없습니다. 일부 패턴은 다른 패턴과 동일할 수 있습니다.)

답변2

잘못된 정규식을 사용했습니다. 좋아요:

cat ./users.txt | grep -v '^c'

다음 없이도 이 작업을 수행할 수 있습니다 cat.

grep -v '^c' ./users.txt

관련 정보