grep은 이전 grep을 출력합니다.

grep은 이전 grep을 출력합니다.

grep한 파일 실행의 여러 줄 출력을 다른 파일의 후속 두 번째 실행 패턴 으로 사용할 수 있습니까 ?grep

예:

  • 콘텐츠file1.txt
    2 blue
    1 red 
    1 green
    2 black
    2 orange
    
  • 콘텐츠file2.txt
    2 blue triangle
    2 blue circle
    3 blue triangle
    2 red triangle
    3 green circle
    4 red square
    2 orange circle
    2 brown circle
    
  • 첫 번째 결과 grep:
    $ grep 2 file1.txt 
    
    2 blue 
    2 black
    2 orange
    

이제 다음과 같은 명령을 찾고 있습니다.

grep <PREVIOUS OUTPUT> file2.txt

file2.txt그러면 다음을 실행하여 생성된 줄 중 하나로 시작하는 모든 줄을 찾게 되므로 원하는 결과는 다음과 같습니다.grepfile1.txt

2 blue triangle
2 blue circle
2 orange circle

답변1

이것이 질문에 대한 답변입니다단어질문.이 작업을 더 잘 해결할 수 있는 답변을 보려면 awk아래 "설명"의 솔루션을 참조하세요.

에서 발견된 패턴이 file1.txt줄의 시작 부분에서만 발생할 수 있다고 가정하면 이 플래그를 사용하여 명령줄에서 정규식으로 선언하는 대신 파일에서 여러 검색 패턴을 읽을 file2.txt수 있습니다 . -f그런 다음 이 파일을 첫 번째 실행의 출력에 연결해야 합니다 grep.

한 가지 방법은프로세스 교체:

grep -F -w -f <(grep -w 2 file1.txt) file2.txt
  • <( ... )구성은 대괄호로 묶인 명령의 출력을 마치 파일인 것처럼 사용할 수 있게 만듭니다.
  • -F플래그는 전체 정규식 검색을 비활성화하고 grep첫 번째 실행의 출력에 정규식 컨텍스트에서 특별한 의미를 갖는 문자가 포함될 수 있는 경우를 대비한 안전 예방 조치입니다. 또한 리터럴 문자열 비교가 정규식 일치보다 빠르기 때문에 일치 속도도 빨라집니다.
  • -w플래그를 사용하면 부분적으로 일치하는 항목이 결과에 입력되지 않습니다. 예를 들어 의 첫 번째 열에 여러 숫자가 포함될 수 있는 grep경우 첫 번째 실행에 특히 바람직합니다 .file1.txt12

고쳐 쓰다

@Stéphane Chazelas가 지적했듯이 이 옵션은 프로그램의 를 참조하기 -f위해 종종(항상은 아니지만) 구현된 값을 허용 하므로 다음과 같이 작성할 수도 있습니다.-stdin

grep -w 2 file1.txt | grep -F -w -f - file2.txt

다른 명령의 출력을 읽으려면 보다 쉽게 ​​식별할 수 있는 파이프 방법을 사용하십시오.


노트

  1. 이는 패턴이 number color의 처음 두 열로만 나타날 수 있다고 가정합니다 file2.txt. 나중에 같은 라인에서 일어날 수도 있다면

    4 red square and 2 blue triangle
    

    이러한 줄은 일치하는 것으로 잘못 식별됩니다.

  2. 표 형식 데이터로 작업하는 경우(여기서 그런 것 같습니다) awk일반적으로 이 도구가 더 적절한 도구입니다. 귀하의 작업은 다음 절차를 통해 수행될 수 있습니다 awk.

    awk -v num="2" 'NR==FNR{if ($1==num){col[$2]}; next} ($1==num) && ($2 in col)' file1.txt file2.txt
    

    그러면 두 파일이 모두 처리됩니다. 검색 키워드는 awk변수를 통해 지정됩니다 num.

    첫 번째 파일을 처리할 때( NR전역 행 카운터가 FNR파일별 행 카운터와 동일함) 두 번째 열에 색상을 등록합니다.배열의 인덱스에서 colcol[$2](따라서 첫 번째 열의 숫자가 일치하면 실제로 아무것도 할당되지 않습니다.) 그런 다음 다음 실행 줄로 점프합니다.

    두 번째 파일을 처리할 때 첫 번째 열이 변수와 일치하는지 num, 두 번째 열이 배열의 인덱스에 있는지 확인합니다 col. 그렇다면 해당 행을 인쇄하십시오.

답변2

해결됨:

$ grep 2 file1.txt | xargs -I{} grep {} file2.txt

2 blue triangle
2 blue circle
2 orange circle

관련 정보