ข้อดีของไฟล์ cat'ing และ piping ถึง grep


19

มีข้อดีเพิ่มเติมของการ cat'ing ไฟล์และ pip ​​ไปยัง grep นอกเหนือจากความสะดวกสบายแล้วหรือยัง? ความสะดวกสบายคือเมื่อฉันดึงคำสั่งเช่นที่ด้านล่างจากประวัติของฉันเคอร์เซอร์อยู่ที่ท้ายบรรทัดดังนั้นจึงง่ายต่อการแก้ไขคำสั่งด้วยข้อความที่แตกต่างเพื่อ grep เทียบกับไฟล์เดียวกัน

ดังนั้นข้อดีอื่น ๆ ของการประชุมต่อไปนี้:

cat /var/tmp/trace.2043925204.xt | grep -in profile
cat /var/tmp/trace.2043925204.xt | grep -n Profile-Main

แทน:

grep -in profile /var/tmp/trace.2043925204.xt 
grep -n Profile-Main /var/tmp/trace.2043925204.xt 

คำตอบ:


21

ดีกว่าที่จะหลีกเลี่ยงแมว เขียนวิธีนี้ถ้าการแก้ไขบรรทัดมีความสำคัญ:

$ < filename grep pattern

เหตุผลคือการส่งข้อมูลทั้งหมดผ่านหน่วยความจำ cat และทรัพยากร CPU ประโยชน์อีกอย่างของการส่งชื่อไฟล์เป็นอาร์กิวเมนต์แทนที่จะเปลี่ยนเส้นทาง stdin คืออนุญาตให้คำสั่งตัวเลือกเพื่อ mmap () ไฟล์


9

ฉันไม่สามารถเชื่อว่าไม่มีใครได้อ้างอิง "ไร้ประโยชน์การใช้งานของแคท" http://www.smallo.ruhr.de/award.htmlเลย

มีข้อได้เปรียบที่น่าสงสัยอย่างหนึ่งคือ หากคุณมีท่อยาวมันดู orthogonal กับแมว:

cat file | command1 | command 2 | command3

มันรวมกลุ่มคำสั่งทั้งหมดเข้าด้วยกัน

แน่นอนอย่างที่คนอื่นพูด (และฉันทำ)

< file command1 | command2 | command3

ทำในสิ่งเดียวกัน อย่างที่บอกว่าแมวตัวนี้ค่อนข้างเล็กและจะไม่ทำให้คอมพิวเตอร์ของคุณลงหากคุณใช้เมื่อคุณไม่ต้องการใช้

ตามปกติโดยใช้catVS โดยตรงกดปุ่มไฟล์ไม่ได้เปลี่ยนแปลงอะไร grepแต่มันไม่สร้างความแตกต่างสำหรับคำสั่งบางอย่างที่ดูแลถ้ามีหลายไฟล์ที่เป็นข้อโต้แย้งเช่น กรณีในจุด:

cat file1 file2 | grep SOMETHING

จะมีผลลัพธ์ที่แตกต่างกว่า

grep SOMETHING file1 file2

ซึ่งจะมีชื่อไฟล์ที่ตรงกันในผลลัพธ์ catมีบางครั้งที่ฉันไม่ต้องการชื่อไฟล์และเป็นประโยชน์โดยใช้


1
catอ่านได้ชัดเจนกว่า<มาก หรือบางทีสำหรับพวกเรากลุ่มหมอกที่คิดว่า Unix และ bash สามารถเรียนรู้ได้มากมายจาก VMS และ DCL
RonJohn

8

ไม่มีข้อได้เปรียบอะไร เคอร์เซอร์ของคุณอยู่ท้ายแล้วก็ไม่สำคัญมากถ้าคุณสร้างมันแบบนี้แทน:< inputfile grep -args foo


6

คุณไม่จำเป็นต้องใช้แมวในสถานการณ์นี้เลย ไม่จำเป็นและเสียเวลาเพราะเครื่องมือเช่น grep ใช้ชื่อไฟล์เป็นอาร์กิวเมนต์

[root@un1xf00 root]# time cat passwd | grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

real    0m0.021s
user    0m0.000s
sys     0m0.030s
[root@un1xf00 root]# time grep root passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

real    0m0.002s
user    0m0.000s
sys     0m0.000s
[root@un1xf00 root]#

อัปเดต: ขอบคุณ @Andy Lester สำหรับการชี้ให้เห็นว่าการกำหนดเวลาเหล่านี้ไม่ได้คำนึงถึงแคชของบัญชี ฉันเรียนรู้สิ่งใหม่! แต่การออมเศษเสี้ยววินาทีไม่ได้สร้างความแตกต่างมากนัก ฉันแค่คิดว่าการส่งแมวเข้า grep ไม่ใช่วิธีที่สมเหตุสมผลในการทำสิ่งต่างๆ มันเหมือนกับการขอให้คนอื่นช่วยคุณในการแก้ปัญหาเมื่อคุณสามารถแก้ไขได้ด้วยตัวเอง


1
@Michael: A -10 สำหรับคุณที่ป้าน คุณอาจได้รับประโยชน์มากกว่านี้ น่าเสียดายที่คุณจะไม่เห็นสิ่งนี้เนื่องจากคุณไม่มีบัญชีที่นี่
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

4
ไมเคิลบอกว่าการตั้งเวลาด้านบนไม่ได้คำนึงถึงแคชของบัญชี (และ -0.29 ถึงเดนนิสที่ให้ความสนใจในการตีไมเคิลมากกว่าการลบคำตอบ)
Andy Lester

1
ฉันคิดว่าถ้าจะต้องมีเสียงมากกว่าส่งสัญญาณความคิดเห็นเป็นสถานที่สำหรับมัน ขอบคุณ @Andy ที่ฉันไม่ทราบว่าไมเคิลหมายถึงดิสก์แคช
Dexygen

3

ความง่ายในการแก้ไขเป็นข้อได้เปรียบที่แท้จริงเพียงอย่างเดียวและหากคุณทำที่บรรทัดคำสั่งเวลาเพิ่มเติมใด ๆ ที่ใช้ในการเรียกใช้catและทำไปป์จะไม่สร้างความแตกต่าง

ไม่มีเหตุผลที่จะทำมันในเชลล์สคริปต์


2

ไม่มีประโยชน์อะไรเลย แทนที่จะกังวลเกี่ยวกับการแก้ไขคำสั่งเรียนรู้วิธีนำทางบรรทัดคำสั่งเชลล์ของคุณได้ดีขึ้นด้วยปุ่มเร่งความเร็วและทางลัด


1

ไม่และอาจช้าลงอย่างเห็นได้ชัดในตัวอย่างที่คุณให้

A pipeสร้างขึ้นระหว่างแมวกับ grep ซึ่งไม่จำเป็นเมื่อส่งชื่อไฟล์โดยตรงไปที่ grep อย่างไรก็ตามฉันไม่คิดว่าภายใต้สถานการณ์ใด ๆ ที่คุณจะสังเกตเห็นข้อ จำกัด ของปริมาณงานเนื่องจากสิ่งนี้

ข้อดีอื่น ๆ ของการป้อนข้อมูล pip ไปยัง grep รวมถึงการประมวลผลเพิ่มเติมก่อนเช่นการใช้โปรแกรมอรรถประโยชน์ที่มีความสามารถในการอ่านไฟล์ขั้นสูงเพิ่มเติม (ดูtee, zcatหมู่คนอื่น ๆ )

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