มีสคริปต์ / โปรแกรม / ยูทิลิตี้สำหรับความต้องการต่อไปนี้แล้วในวิธีที่ได้รับการปรับให้เหมาะสมหรือไม่?
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>
? ถ้ามันได้รับการประเมินในแต่ละครั้งที่มีเงื่อนไขการสั่งคุณต้องการปิดท้ายด้วยสองไฟล์หนึ่งบรรทัด ...