เป็นไปได้ที่จะกรองเอาท์พุทของหางหรือไม่?


11

ฉันต้องการตัดต่อไฟล์ แต่มีเฉพาะบรรทัดเอาต์พุตที่มีสตริงที่แน่นอน เป็นไปได้ไหม

คำตอบ:


32

ใช้ grep มันสร้างขึ้นเพื่อจุดประสงค์นั้น

หากต้องการค้นหาบรรทัดจากส่วนท้ายของ / var / log / syslog ที่มี "cron" อยู่ในบรรทัดให้เรียกใช้:

tail -f /var/log/syslog | grep cron

และเนื่องจากมันยอมรับทุกอย่างบน stdin คุณจึงสามารถใช้มันในเอาต์พุตของคำสั่งอื่น ๆ ได้เช่นกันโดยการไพพ์ในลักษณะเดียวกันกับข้างบน (ใช้สัญลักษณ์ |)


8
ในขณะที่สิ่งนี้ถูกต้องเป็นสิ่งสำคัญที่ต้องตระหนักว่าgrepจะบัฟเฟอร์เมื่อมีการใช้แบบไม่โต้ตอบเช่นเมื่อมันเป็นส่วนหนึ่งของไปป์ไลน์ที่ยาวขึ้น GNU grep 2.5.1 เสนอ--line-bufferedตัวเลือกในการแก้ไขปัญหานี้เมื่อกำจัด grep จากไพพ์ไลน์ไม่ใช่ตัวเลือก (เมื่อฉันพูด grep จะbufferฉันหมายความว่าคุณจะไม่เห็นการส่งออกจนกว่าบัฟเฟอร์ได้ถึงสิ่งที่ต้องการ 4k.)
Kojiro

เพื่อเสริมความคิดเห็นก่อนหน้านี้ "tail -f" ภายใต้ลินุกซ์ที่ทันสมัยจะทำงานในวงรอการป้อนข้อมูลเพิ่มเติมในไฟล์ syslog หากต้องการให้คำสั่งเสร็จสิ้นด้วยเนื้อหาที่มีอยู่จริงของไฟล์ให้ข้ามสวิตช์ -f: tail / var / log / syslog | grep cron
Gnudiff


4

ต่อไปนี้เป็นแนวคิดอื่น ๆ สองสามข้อที่แม้จะไม่ง่ายอาจมีความยืดหยุ่นเพิ่มเติมที่น่าสนใจ:

ก่อนอื่นคุณสามารถกรองด้วย awk แทน grep:

tail -f /var/log/messages | awk '/myfilterword/'

grepว่างานตรงเช่นเดียวกับตัวอย่างการใช้ คุณสามารถขยายสิ่งนี้โดยใช้พลังของ awk ตัวอย่างเช่น:

tail -f /var/log/messages | \
awk '/myfilterword/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n")}'

ซึ่งจะพิมพ์ลำดับที่ 6 ถึงฟิลด์สุดท้ายของเอาต์พุต (ฟิลด์ถูกคั่นด้วยช่องว่าง)

อีกแนวคิดที่คล้ายกันคือใช้ perl one-liner:

tail -f /var/log/messages | perl -ne "/myfilterword/ and print"

grepที่ทำงานเหมือนกัน บางทีคุณอาจต้องการตัวนับหมายเลขบรรทัดและเพียงฟิลด์ที่ 6? เกี่ยวกับสิ่งนี้:

tail -f /var/log/messages | \ 
perl -lane "/myfilterword/ and printf \"%6d %s\n\",++\$a,\$F[6]"

เห็นได้ชัดว่าสิ่งต่าง ๆ เหล่านี้สามารถทำได้ด้วยเครื่องมืออื่น ๆ เช่นกัน แต่ฉันต้องการแสดงให้เห็นว่ามีวิธีสนุก ๆ ในการใช้ภาษาที่มีวัตถุประสงค์ทั่วไปเช่น awk หรือ perl ที่นี่


+1 ที่ยอดเยี่ยมเกี่ยวกับวิธีการขยายมากกว่า grep!
pablo

2

เคล็ดลับอีกอย่างหนึ่งที่ควรระวังหากคุณมีไฟล์ CSV ที่มีส่วนหัวที่คุณไม่ต้องการเช่น

% cat data.txt
fruit        dessert        calories
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990
% tail -n +2 data.txt
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990

ไม่สำคัญว่าอินพุตจะtailอยู่นานเท่าไรข้อมูล+n -2จะละเว้นบรรทัดแรก

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