ฉันจะเปลี่ยนเส้นทางการจับคู่ไปยังไฟล์และไม่ตรงกับไฟล์อื่นได้อย่างไร


13

มีสคริปต์ / โปรแกรม / ยูทิลิตี้สำหรับความต้องการต่อไปนี้แล้วในวิธีที่ได้รับการปรับให้เหมาะสมหรือไม่?

someCommand |
   tee >(grep "pattern" > LinesWhichMatch) |
   grep -v "pattern" > LinesWhichDoesNotMatch

คำตอบ:


16

คุณสามารถใช้awkสิ่งนั้นได้

command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'

1
ฉันไม่สมบูรณ์คุ้นเคยกับawkแต่สิ่งที่จุดไม่ได้ evaluade >? ถ้ามันได้รับการประเมินในแต่ละครั้งที่มีเงื่อนไขการสั่งคุณต้องการปิดท้ายด้วยสองไฟล์หนึ่งบรรทัด ...
Shadur

1
@Shadur >พิมพ์เอาต์พุตทั้งหมดไปที่ไฟล์เขียนทับไฟล์ที่มีอยู่ มันไม่ได้มีการประเมินผลในลักษณะดังกล่าวว่าจะส่งผลให้เกิดริ้วรอยใหม่ ๆ awkเขียนทับเอาท์พุทเก่าจากอินสแตนซ์เดียวกันของ นั่นคือถ้ามีหลายแมตช์ไฟล์ "จับคู่" OFSจะมีการแข่งขันแต่ละคั่นด้วย ความแตกต่างระหว่าง>และ>>มีอยู่ในการจัดการไฟล์ที่มีอยู่
Chris Down

10

นี่คือsedตัวอย่าง:
หมายเหตุ: wคำสั่งของ sed จะเขียนทับไฟล์ที่มีอยู่ในแต่ละครั้งที่รันสคริปต์ แต่เฉพาะในกรณีที่คำสั่งเขียนนั้นถูกทริกเกอร์ ดังนั้น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
don_crissti

6

คุณสามารถต่อท้ายไฟล์ใน awk:

awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }

หรือสั้นกว่า:

awk '{print >>(/pattern/?"matched":"unmatched")}'

ตัวอย่างของเขาแสดงให้เห็นว่าเขาต้องการเขียนทับไฟล์หากมีอยู่ไม่ได้ต่อท้าย
Chris Down
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.