동일한 명령에서 grep -v -e 'expr1' 및 grep -e 'expr2'를 실행하는 방법은 무엇입니까?

동일한 명령에서 grep -v -e 'expr1' 및 grep -e 'expr2'를 실행하는 방법은 무엇입니까?

www.다음으로 시작하지 않고 다음을 포함하지 않는 문자열을 추출하는 다음 명령이 있습니다 /.

grep -v -e '^www\.' -e '/' test2.txt 

somestring.somestring그러나 다음 명령을 사용하여 달성할 수 있는 일치 패턴 외에도 위의 내용을 원합니다 .

grep -e '^[^\.]*\.[^\.]*$'

모든 서류를 한 줄에 넣는 방법은 무엇입니까?

답변1

grep한 번의 호출로 역방향 일치와 순방향 일치를 결합 할 수 없습니다.

당신은 이것을 할 수 있습니다 sed:

sed -e '/^www\./d' -e '/\//d' -e '/^[^.]*\.[^.]*$/!d' ./*.txt

또는 awk( sed일치하는 파일의 이름을 인쇄할 수 있는 것과 반대 grep):

awk -F. 'NF == 2 && !/^www\./ && !/\// {print FILENAME": "$0}' ./*.txt

파일 이름을 인쇄하지 않으려면 두 개의 grep 호출을 사용하여 이를 수행할 수 있습니다.

cat ./*.txt | grep '^[^.]*\.[^.]*$' | grep -v -e / -e '^www\.'

cat이는 표준 입력으로 모든 파일의 내용을 제공하는 데 사용되므로 첫 번째 파일은 grep파일 이름을 인쇄하지 않습니다. 일부 구현에서는 파일이 여러 개 있는 경우 grep파일 이름 인쇄를 건너뛰어야 합니다 . grep -h파일 이름이 하나만 있는 경우 grep파일 이름은 인쇄되지 않으며 리디렉션을 통해 표준 입력에 공급할 수 있습니다.

<onefile.txt grep '^[^.]*\.[^.]*$' | grep -v -e / -e '^www\.'

이를 지원하는 경우 PCRE의 (?!...)부정 예측 연산자를 사용하여 부정을 달성할 수 있습니다.grep-P

grep '^(?!www\.)(?!.*/)[^.]*\.[^.]*$' ./*.txt

하지만 여기서는 다음과 같이 모든 작업을 수행할 수 있습니다 -v.

grep -v -e / -e '^www\.' -e '^[^.]*$' -e '\..*\.'

또한 포인트가 없는 행과 여러 포인트가 포함된 행도 제외됩니다.

답변2

첫 번째 grep결과를 두 번째 결과로 파이프합니다 grep.

관련 정보