내 컴퓨터 공학 수업 중 선생님이 우리에게 사용자 파일을 주었습니다. 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
.
-e
or -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