รักษาสีหลังจากการ grep piping เพื่อ grep


140

มีคำถามเกี่ยวกับ simlar ในPreserve ls หลังจาก grep'ingแต่มันทำให้ฉันรำคาญว่าถ้าคุณใส่ grep color output ไปยัง grep ตัวอื่นที่สีนั้นไม่ได้ถูกสงวนไว้

เป็นตัวอย่างgrep --color WORD * | grep -v AVOIDไม่ให้สีของเอาท์พุทแรก แต่สำหรับฉันls | grep FILEเก็บสีทำไมถึงแตกต่าง


2
คำถามนี้ดูเหมือนจะปิดหัวข้อเพราะมันเป็นเรื่องเกี่ยวกับการใช้งานคำสั่งยูนิกซ์เป็นunix.stackexchange.com
Raptor

คำตอบ:


162

grepบางครั้งปิดใช้งานเอาต์พุตสีตัวอย่างเช่นเมื่อเขียนไปยังไพพ์ คุณสามารถแทนที่พฤติกรรมนี้ด้วยgrep --color=always

บรรทัดคำสั่งที่ถูกต้องจะเป็น

grep --color=always WORD * | grep -v AVOID

นี่คือ verbose สวยหรือคุณสามารถเพิ่มบรรทัด

alias cgrep="grep --color=always"

.bashrcตัวอย่างของคุณและใช้cgrepเป็น grep สี เมื่อทำการกำหนดใหม่grepคุณอาจพบปัญหากับสคริปต์ซึ่งขึ้นอยู่กับเอาต์พุตเฉพาะgrepและไม่ชอบรหัส ascii


4
โซลูชันนี้ใช้งานได้ในบางสถานการณ์ที่โชคดีเท่านั้น ดูคำตอบของ andersonvom ด้านล่าง
studog

ในกรณีของฉัน (Ubuntu) grepผมมีอยู่แล้วชื่อแทน alias grep='grep --color=autoดังนั้นฉันต้องเปลี่ยน~/.bashrcที่ที่มันถูกกำหนดไว้ในตอนแรก
sobi3ch

ไม่ทำงานสำหรับฉัน - คล้ายกับสถานการณ์นี้stackoverflow.com/a/7640077/248616
Nam G VU

ความคิดสร้างสรรค์ที่ดีนี้เป็นเพียงการทำงานที่ง่ายและstackoverflow.com/a/36288791/248616
Nam G VU

คำถามเกี่ยวกับวิธีที่จะทำให้ grep ตัวที่สองไม่สามารถกำจัดสีของสีตัวแรกได้ นี่ไม่ใช่คำตอบสำหรับสิ่งนั้น
johannes_lalala

74

คำแนะนำ:

เมื่อใช้grep --color=alwaysงานสตริงจริงที่ส่งผ่านไปยังไพพ์ถัดไปจะถูกเปลี่ยน สิ่งนี้สามารถนำไปสู่สถานการณ์ต่อไปนี้:

$ grep --color=always -e '1' * | grep -ve '12'
11
12
13

แม้ว่าตัวเลือกที่-ve '12'ควรแยกสายกลางก็จะไม่ได้เพราะมีตัวอักษรสีระหว่างและ12


หากคุณใช้--color=autoมันควรจะรับความจริงที่ว่าคุณกำลังวางท่อไว้ที่อื่นและระงับสีโดยสิ้นเชิง แต่มันก็เอาชนะวัตถุประสงค์ได้ หากคุณยังคงต้องการผลสีผมคิดว่าคุณสามารถ grep --colorมันอีกครั้งในท่อที่ผ่านมาโดยใช้
andersonvom

2
บน Mac OS X อย่างน้อยการระบายสีที่ไพพ์สุดท้ายตามที่ @andersonvom แนะนำไม่ทำงาน ไม่แน่ใจว่าทำไม; บางทีมันอาจเป็นรูปแบบสีที่ถูกแยกออก? --color=alwaysทำงานด้วยผมคิดว่า caveats ดังกล่าวข้างต้น
user766353

3
คุณต้องมีรูปแบบ grep เดียวกันสองครั้งในนิพจน์ของคุณ ฉันเพิ่งทดสอบสิ่งนี้ใน mac: http://i.imgur.com/BhmwAlF.png
andersonvom

9

เพียงทำซ้ำคำสั่ง grep เดียวกันที่ส่วนท้ายของไพพ์ของคุณ
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD


2
จะไม่กลับคำสั่งให้ผลลัพธ์เดียวกันหรือไม่ grep -v AVOID * | grep WORD
Brydon Gibson

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