วิธีไพพ์เอาต์พุตของสตรีมที่แอ็คทีฟไปยังคำสั่งอื่น


2

ฉันกำลังพยายามไพพ์สตรีมที่แอ็คทีฟไปยังคำสั่งอื่น (อาจเป็นสคริปต์ทุบตี) แต่ก็ต้องการรอให้สตรีมทั้งหมดเสร็จสิ้นก่อนที่จะประมวลผลคำสั่ง s.g. ฉันสามารถทำสิ่งนี้:

tail file.log | grep keyword | xargs -L 1 echo ...

และมันจะแสดงผลแถวที่ตรงกันจาก file.log อย่างถูกต้องนำหน้าด้วย "... " เห็นได้ชัดว่าฉันไม่ต้องการเพียงแค่ก้องนั่นเป็นเพียงตัวอย่างที่ง่ายขึ้น ตอนนี้เมื่อฉันลองทำสิ่งนี้:

tail -f file.log | grep keyword

งานนี้ในที่เป็นผลลัพธ์แถวที่ตรงกันแล้วหยุดชั่วคราวจนกว่า file.log เปลี่ยนแปลงแล้วมันจะออกบรรทัดใหม่ที่ตรงกัน อย่างไรก็ตามถ้าฉันลองทำสิ่งนี้:

tail -f file.log | grep keyword | xargs -L 1 echo ...

มันไม่มีอะไรส่งออก - ฉันคิดว่ามันกำลังรอกระแสที่เปิดโดย tail -f เพื่อสิ้นสุด ฉันได้ลองแล้วเช่นกัน:

tail -f file.log | grep keyword | while read line; do echo...$line; end

โดยไม่มีการเปลี่ยนแปลงพฤติกรรม ฉันได้อ่านคำถามอื่น ๆ ที่นี่ว่าควรจะทำงาน ฉันใช้ Ubuntu 14.04 มีความแตกต่างบ้างไหม? ฉันจะทำให้เรื่องนี้ทำงานได้อย่างไร

คำตอบ:


1

คุณพูดถูก xargs คาดว่าอินพุตจากอินพุตมาตรฐานดังนั้นจึงรอสตรีมถึงจบ วิธีหนึ่งที่จะทำให้มันทำงานได้ก็คือ การทดแทนกระบวนการ , เพราะ ...

การทดแทนกระบวนการเป็นรูปแบบของการเปลี่ยนเส้นทางที่อินพุตหรือเอาต์พุตของกระบวนการ

ดังนั้นคุณควรลอง:

while IFS= read -r newline; do echo $newline | grep keyword | cat >> filename  ; done < <(tail -f file.log)

ซึ่งจำหน่ายด้วย xargs โดยสิ้นเชิง


มันทำงานได้อย่างสมบูรณ์แบบ! ฉันเคยเห็นไวยากรณ์ "& lt; & lt; (... )" ที่อื่น แต่ไม่เข้าใจว่ามันแปลว่าอะไร ขอบคุณสำหรับคำอธิบาย!
lalitm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.