2014-05-07 18 views
8

Nói rằng tôi có command1 mà kết quả đầu ra này:grep sử dụng đầu ra từ một lệnh

b05808aa-c6ad-4d30-a334-198ff5726f7c 
59996d37-9008-4b3b-ab22-340955cb6019 
2b41f358-ff6d-418c-a0d3-ac7151c03b78 
7ac4995c-ff2c-4717-a2ac-e6870a5670f0 

Tôi cũng có command2 mà kết quả đầu ra này:

b05808aa-c6ad-4d30-a334-198ff5726f7c 
59996d37-9008-4b3b-ab22-340955cb6019 

Có cách nào để grep đầu ra từ command1 để không bao gồm bất kỳ dòng nào được so khớp từ command2, sao cho kết quả cuối cùng trông như thế này?

2b41f358-ff6d-418c-a0d3-ac7151c03b78 
7ac4995c-ff2c-4717-a2ac-e6870a5670f0 
+0

Có thể thực hiện được với 'sắp xếp' và 'awk' –

+0

Các dòng đó có phải không? Nếu có, vâng. – Jiminion

Trả lời

13

Issue grep này

command1 | grep -vF -f <(command2) 

Ở đây,

-F nghĩa Cố định trận đấu chuỗi *

-v nghĩa nghịch trận đấu

-f có nghĩa là tập tin với pat terns

<(command) thực sự tạo FIFO bằng lệnh đó và sử dụng nó trên chuyển hướng.

+0

Xin cảm ơn, tôi đã thiếu phần <(), không biết bạn có thể làm điều đó – bruchowski

5

Để có được tất cả các dòng từ đầu ra của command1 không xuất hiện trong đầu ra của command2:

grep -vFf <(command2) <(command1) 

-f nói grep để sử dụng các mẫu đến từ một tập tin. Trong trường hợp này, tệp đó là đầu ra của command2. -F yêu cầu grep rằng các mẫu đó được coi là chuỗi cố định chứ không phải regex. -v yêu cầu grep đảo ngược hoạt động bình thường của nó và chỉ hiển thị các đường kẻ làm không phù hợp với.

+0

Cảm ơn John, tôi đã bình chọn cho bạn, nhưng tôi đã đánh dấu câu trả lời khác chỉ vì tôi thích cú pháp tốt hơn – bruchowski

Các vấn đề liên quan