grep -f 에서 일치하는 패턴 대신 일치 결과가 나온 패턴을 인쇄할 수 있나요?

grep -f 에서 일치하는 패턴 대신 일치 결과가 나온 패턴을 인쇄할 수 있나요?

명령에서 최종 일치 문자열이 아닌 grep -f input_pat.txt match_in.txt일치 패턴을 인쇄하는 방법을 찾고 있습니다 .input_pat.txtmatched_in.txt

예를 들면 input_pat.txt다음과 같습니다.

abc...blahblah

그리고 match_in.txt:

abcdefblahblah

"abc...blahblah"출력물에 인쇄하고 싶습니다 .

답변1

grep을 두 번 호출하면 수행할 수 있습니다. 약간 비싸지만 작업이 완료됩니다. 패턴 파일이 pat.txt이고 검색하려는 파일이 data.txt라고 가정해 보겠습니다.

paste <(grep -o -f pat.txt  data.txt ) <(grep -f pat.txt data.txt )

두 명령의 두 출력이 파일로 처리 <( ... )되도록 프로세스 대체를 사용합니다 . paste첫 번째 명령에서 -o옵션은 일치하는 패턴만 인쇄합니다. 두 번째 명령에서는 완전히 일치하는 줄을 인쇄합니다.

순서는 일대일이므로 두 출력을 나란히 붙여넣는 것이 안전합니다(grep을 수행할 때 스키마 파일이나 데이터 파일이 변경되지 않았다고 가정).

답변2

확장 정규식(예: grep -E)으로 전환하는 것이 허용되는 경우 awk반대 접근 방식을 사용하여 다음을 수행할 수 있습니다.

awk '
  !end_of_re_list {if (!(re[$0]++)) n++; next}
  {
    for (i in re)
      if ($0 ~ i) {
        print i
        delete re[i]
        if (--n == 0) exit
      }
  }' input_pat.txt end_of_re_list=1 match_in.txt

관련 정보