diff 출력을 사용하여 별도의 파일과 비교해 보세요.

diff 출력을 사용하여 별도의 파일과 비교해 보세요.

두 개의 파일이 있습니다.

smw:/working/iso_testing # cat a
QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica-20140724-2.1.2.i586.rpm
test.rpm

그리고

smw:/working/iso_testing # cat b
QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica-20140724-2.1.2.i586.rpm

--비교하면 다음과 같습니다.

smw:/working/iso_testing # diff a b
4d3
< test.rpm

해당 출력(test.rpm)을 가져와서 세 번째 파일에서 가져오고 싶습니다. 일명 파일 c:

smw:/working/iso_testing # cat c
QConvergeConsoleCLI QConvergeConsoleCLI-1.1.03-49.x86_64.rpm
aaa_base aaa_base-13.2+git20140911.61c1681-1.3.i586.rpm
acpica acpica-20140724-2.1.2.i586.rpm
test test.rpm

내가 원하는 출력은 다음과 같습니다

test test.rpm

어쩌면 시작해야 할 파일이 많지만 막혔을 수도 있습니다. 미리 감사드립니다

파일 A는 리포지토리의 rpm 목록이고, 파일 B는 .csv 파일의 rpm 목록이며, 파일 C는 파일 B의 복사본이지만 rpm만 아닌 패키지 이름을 포함합니다. ***

답변1

TLDR 솔루션은 다음과 같습니다.

for line in "$(diff a b | sed -n 's/^< //p')"; do grep "${line}" c; done

아래는 좀 더 자세한 설명입니다.


가장 먼저 할 일은 명령의 출력을 정리 diff하고 검색하려는 문자열을 추출하는 것입니다.

귀하의 예에 따르면 첫 번째 파일(예: 파일 "a")에만 표시되는 행을 원하는 것 같습니다.

다음 명령은 첫 번째 파일의 줄을 반환하고 "<" 접두사를 제거합니다.

diff <(diff a b | sed -n 's/^< //p')

이제 각 줄에 대해 정리된 diff 및 grep을 반복할 수 있습니다. 예를 들면 다음과 같습니다.

for line in "$(diff a b | sed -n 's/^< //p')"; do grep "${line}" c; done

이 접근 방식의 장점은 grep명령문을 어떤 명령으로든 바꿀 수 있으므로 매우 유연하다는 것입니다.

반면에 고정된 문자열만 검색하려는 경우 for 루프를 사용하는 대신 -ffor 플래그를 사용할 수도 있습니다.grep

grep -f <(diff a b | sed -n 's/^< //p') c

diff또 다른 옵션은 두 번째로 전화하는 것입니다.

diff <(diff a b | sed -n 's/^< //p') c

그런 다음 비슷한 방식으로 이 출력을 처리할 수 있습니다.

diff <(diff a b | sed -n 's/^< //p') c | sed -n 's/^< //p'

관련 정보