มีสคริปต์ / โปรแกรม / ยูทิลิตี้สำหรับความต้องการต่อไปนี้แล้วในวิธีที่ได้รับการปรับให้เหมาะสมหรือไม่?
someCommand |
tee >(grep "pattern" > LinesWhichMatch) |
grep -v "pattern" > LinesWhichDoesNotMatch
มีสคริปต์ / โปรแกรม / ยูทิลิตี้สำหรับความต้องการต่อไปนี้แล้วในวิธีที่ได้รับการปรับให้เหมาะสมหรือไม่?
someCommand |
tee >(grep "pattern" > LinesWhichMatch) |
grep -v "pattern" > LinesWhichDoesNotMatch
คำตอบ:
คุณสามารถใช้awkสิ่งนั้นได้
command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'
>พิมพ์เอาต์พุตทั้งหมดไปที่ไฟล์เขียนทับไฟล์ที่มีอยู่ มันไม่ได้มีการประเมินผลในลักษณะดังกล่าวว่าจะส่งผลให้เกิดริ้วรอยใหม่ ๆ awkเขียนทับเอาท์พุทเก่าจากอินสแตนซ์เดียวกันของ นั่นคือถ้ามีหลายแมตช์ไฟล์ "จับคู่" OFSจะมีการแข่งขันแต่ละคั่นด้วย ความแตกต่างระหว่าง>และ>>มีอยู่ในการจัดการไฟล์ที่มีอยู่
นี่คือ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
คุณสามารถต่อท้ายไฟล์ใน awk:
awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }
หรือสั้นกว่า:
awk '{print >>(/pattern/?"matched":"unmatched")}'
awkแต่สิ่งที่จุดไม่ได้ evaluade>? ถ้ามันได้รับการประเมินในแต่ละครั้งที่มีเงื่อนไขการสั่งคุณต้องการปิดท้ายด้วยสองไฟล์หนึ่งบรรทัด ...