Câu trả lời:
Bạn có thể sử dụng awk
cho điều đó.
command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'
>
in tất cả đầu ra ra tệp, ghi đè các tệp hiện có. Nó không được đánh giá theo cách mà nó sẽ dẫn đến bất kỳ dòng mới nào ghi đè đầu ra cũ từ cùng một ví dụ awk
. Nghĩa là, nếu có nhiều kết quả khớp, tệp "khớp" sẽ chứa mỗi kết quả được phân tách bằng OFS
. Sự khác biệt giữa >
và >>
tồn tại trong điều trị các tập tin hiện có.
Dưới đây là một sed
ví dụ:
Lưu ý: w
lệnh của sed sẽ ghi đè lên tệp hiện có mỗi khi tập lệnh được chạy, nhưng chỉ khi lệnh ghi cụ thể đó được kích hoạt; vì thếrm
rm -f file-{yes,not}
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file
sed -n '/PATTERN/p;//! w file-not' infile >file-yes
Bạn có thể chắp thêm các tập tin trong awk:
awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }
hoặc ngắn hơn:
awk '{print >>(/pattern/?"matched":"unmatched")}'
awk
nhưng tại thời điểm nào nó đánh giá>
? Nếu được đánh giá mỗi lần áp dụng điều kiện, bạn sẽ kết thúc với hai tệp một dòng ...