ส่งออกไปยัง stdout และในเวลาเดียวกัน grep เป็นไฟล์


18

stdoutฉันมีสคริปต์ที่ข้อความขาออกไป ฉันต้องการที่จะเห็นผลลัพธ์ทั้งหมดนี้ใน terminal ของฉันและในเวลาเดียวกันฉันต้องการที่จะกรองบางบรรทัดและบันทึกไว้ในไฟล์ ตัวอย่าง:

$ myscript
Line A
Line B
Line C

$ myscript | grep -P 'A|C' > out.file

$ cat out.file
Line A
Line C

ฉันต้องการเห็นเอาต์พุตของคำสั่งแรกในเทอร์มินัลและบันทึกผลลัพธ์ของคำสั่งที่สองในไฟล์ ในเวลาเดียวกัน. ฉันพยายามใช้teeแต่ไม่มีผลกับหรือดีกว่ามีผลตรงกันข้าม

คำตอบ:


27

ฉันต้องการเห็นเอาต์พุตของคำสั่งแรกในเทอร์มินัลและบันทึกผลลัพธ์ของคำสั่งที่สองในไฟล์

ตราบใดที่คุณไม่สนใจว่าสิ่งที่คุณกำลังดูมาจากstdoutหรือstderrคุณยังสามารถใช้tee:

myscript | tee /dev/stderr | grep -P 'A|C' > out.file

จะทำงานบน linux ฉันไม่รู้ว่า "/ dev / stderr" ใช้ได้กับ * nixes อื่น ๆ


9
/dev/stderrเป็นเรื่องปกติ /dev/tty(หมายถึงขั้วปัจจุบัน) ก็จะทำงานที่นี่และเป็นมาตรฐาน
Gilles 'หยุดความชั่วร้าย'

@Gilles: ยอดเยี่ยม tee /dev/ttyทำหน้าที่อย่างน่าพิศวงสำหรับความต้องการของฉันที่ต้องพิมพ์stdoutสคริปต์ไปยังเทอร์มินัลและไพพ์ไปที่stdinคำสั่งอื่นเช่นกัน! Thankees! :-)
jamadagni

8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

หรือด้วยการทดแทนกระบวนการ (ksh93, zsh หรือ bash):

... | tee >(grep -e A -e C > out.file)

ด้วย zsh:

... >&1 > >(grep -e A -e C > out.file)

ฉันพบว่าฉันต้องใช้อันแรกเพราะมันคงรหัสทางออกของ grep ไว้ นอกจากนี้หากด้วยเหตุผลบางอย่างที่คุณไม่สามารถเข้าถึงระบบไฟล์ / dev ได้/dev/fd/3สามารถแทนที่ด้วย>(cat 1>&3)
golvok

4

นี่เป็นอีกวิธีด้วยsed:

myscript | sed '/PATTERN/w out.file'

โดยค่าเริ่มต้นsedพิมพ์ทุกบรรทัดดังนั้นในกรณีนี้stdoutจะเหมือนกับstdin (นั่นคือคุณจะเห็นผลลัพธ์ทั้งหมดmyscriptบนหน้าจอ)
นอกจากนี้การจับคู่บรรทัดทั้งหมดPATTERNจะถูกwตัดเป็นout.file


-1

คุณไม่ได้ระบุวิธีการใช้คำสั่ง tee แต่วิธีนี้จะใช้ได้:

myscript | grep -P 'A|C' | tee out.file

อย่างน้อยก็ทำงานบนเซิร์ฟเวอร์ของฉันไม่กี่นาทีที่ผ่านมา ...


4
แต่ถ้าฉันไม่ผิดวิธีที่คุณgrepก็มีอะไรบนหน้าจอ ฉันต้องการที่จะเห็นผลลัพธ์ทั้งหมดบนหน้าจอและกรองเฉพาะสิ่งที่จะเป็นไฟล์
lorenzo-s
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.