쉘 스크립트에서 변수 값을 얻기 위해 grep하는 방법은 무엇입니까?

쉘 스크립트에서 변수 값을 얻기 위해 grep하는 방법은 무엇입니까?

2개의 파일이 있습니다.

  • 내가 찾고 싶은 값이 가득한 파일
  • 내 소스 텍스트 파일

나는 값 목록을 반복하고 소스 파일에 대해 grep을 수행하는 짧은 쉘 명령을 작성했습니다. 파일에서 값을 찾을 수 없으면 값을 인쇄하고 싶습니다.

문제는 모든 값을 인쇄하기 때문에 값을 제대로 grep하지 않아서 항상 일치하지 않고 값을 인쇄한다는 것입니다. 누군가 내가 뭘 잘못하고 있는지 말해 줄 수 있기를 바랍니다. 미리 감사드립니다.

이건 내 스크립트야

for i in `cat uniq_val.out`
do
   found=`grep "$i" fd.out`
   if [ -z "${found}" ]
   then
      echo $i
   fi
done

예를 들어, 내 uniq_val.out에 다음이 포함되어 있는 경우:

abc123
def456
ghi789
jkl101112
mno131415

내 fd.out에는 다음 내용이 포함되어 있습니다.

abc123
def456
mno131415

내 쉘 스크립트가 반환되기를 원합니다

ghi789
jkl101112

답변1

다음과 같은 다양한 접근 방식을 권장합니다.

grep -f <(grep -o -f uniq_val.out fd.out) -v uniq_val.out

즉, 내부적으로 는 패턴 파일 grep로 작동 하고 일치하는 부분만 반환합니다. 외부적으로 grep은 목록에서 이러한 값의 역수를 수행합니다.uniq_val.outgrep

그러나 내가 아는 한 -o이것은 POSIX가 아닙니다.


편집하다다음과 같은 문제가 있는 샘플 파일:

두 파일 모두 실제로 일치만 필요한 한 줄 문자열인 경우 패턴 파일의 논리를 반대로 바꾸고 -x전체 줄 일치를 사용합니다.

grep -vx -f fd.out uniq_val.out

이는 POSIX와 호환됩니다.

답변2

GNU coreutils는 (정렬된) 문자열 세트로 작업하기 위한 도구를 제공합니다. 귀하의 경우 grepfor 루프를 포기하고 comm대신 사용하는 것이 좋습니다.

$ comm -23 uniq_val.out fd.out
ghi789
jkl101112

man comm:

comm - 정렬된 두 파일을 한 줄씩 비교합니다. -2및 키는 FILE1에 특정한 행만 -3인쇄합니다 .comm

문자열 및 테이블 세트에 사용할 수 있는 다른 유용한 도구로는 데이터 tr를 준비하는 , 및 몇 가지 간단한 작업을 수행하는 데 사용할 수 있습니다. 이러한 도구는 and 는 물론이고 universal , and보다 더 간단 합니다 .sortuniqjoincutpastesedgrepawkperlpython

관련 정보