รับผลลัพธ์ที่มีสีเมื่อใช้ไพพ์จาก grep ถึงน้อย


246

ฉันใช้ - สีตัวเลือกของ grep มาก แต่ฉันก็ใช้น้อยกว่าเช่นกัน ฉันจะส่งผล grep ไปยังน้อยลงและยังคงรักษาสี (หรือว่าเป็นไปได้?)

grep "search-string" -R * --colour | less 

แก้ไข :

ฉันกำลังมองหาวิธีการแก้ปัญหาโดยตรงหรืออะไรก็ตามที่เทียบเท่ากับนี้


เป็นไปได้ที่ซ้ำกันของการรับสีในคำสั่ง 'น้อย' '
Ciro Santilli 新疆改造中心 996ICU 六四事件

อะไร*ทำอย่างไร จากหน้า man of grep: *: The preceding item will be matched zero or more times.แต่ฉันก็ยังไม่เข้าใจ .. ! @JeremyPowell
Shayan

คำตอบ:


274

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

grep --color=always -R "search string" * | less

lessจะช่วยให้เสมอสีและแทนที่การตรวจสอบโดยอัตโนมัติและคุณจะได้รับการเน้นสีใน

แก้ไข:ถึงแม้ว่าการใช้lessงานได้ผลสำหรับฉัน แต่รุ่นเก่าอาจต้องการการ-Rตั้งค่าสถานะเพื่อจัดการกับสีตามที่แนะนำจากที่นี่


141
คุณจำเป็นต้องใช้less -Rเพื่อให้การแปลรหัสสีตีความได้ถูกต้องน้อยลง
จากที่นั่น

1
มันใช้งานได้สำหรับฉันด้วยแค่lessมันอาจจะขึ้นอยู่กับรุ่น
drrlvn

1
A (หวังว่า) ภาคผนวกที่มีประโยชน์: ฉันจำเป็นต้องแยกการแข่งขันบางอย่าง แต่รักษาสีดังนั้นฉันจึงลงเอยด้วยgrep pattern file | grep -v badpattern | grep --colour=always pattern | less -Rซึ่งตรงกับความต้องการของฉันอย่างสมบูรณ์ (ขอขอบคุณอีกครั้ง!)
Owen Blacker

7
ฉันไม่อยากจะเชื่อเลยว่าพวกเขาเพิ่งใช้คุณสมบัติการจัดการสีด้วยlessเหตุนี้จึงพลาดโอกาสที่จะมีcolorlessเครื่องมือพิเศษ สำหรับชื่อคนเดียวมันควรจะทำ! ฉันอาจจะเขียนแพทช์ที่จะเรียก -R colorlessโดยอัตโนมัติเมื่อไบนารีที่มีการทำงานเป็น
Christian

2
@OwenBlacker มันอาจไม่ใช่นามแฝง คุณอาจเคยตั้งด้วย$LESS -R
greyfade

27

คุณสามารถใส่มันลงใน.bashrcไฟล์ของคุณ:

export GREP_OPTIONS="--color=always"

หรือสร้างนามแฝงเช่นนี้:

alias grepc="grep --color=always"

และคุณจะต้องใช้-Rตัวเลือกสำหรับตามที่อธิบายไว้จากที่lessนั่น


29
คำเตือน!: GREP_OPTIONS = "- color = always" อาจแตกสคริปต์จำนวนมากที่ใช้ grep (หรือ (e | f) grep)
mctylr

4
ใช่ดีกว่าเพียงนามแฝง grep คุณสามารถทำให้บริสุทธิ์grepด้วยGREPหรือแทนที่--colorตัวเลือกด้วยตนเอง
asmeurer

สิ่งนี้ไม่ได้ผลสำหรับฉัน
saeedgnu

9

/usr/local/binในกรณีเช่นนี้ผมชอบที่จะสร้างไฟล์จริงดวลจุดโทษขนาดเล็กและวางไว้บน
ฉันมักจะใช้grepวิธีแบบเรียกซ้ำในpwdสคริปต์ส่วนตัวของฉัน:

#!/bin/sh
grep --color=always -r "$@" . | less -R

จากนั้นฉันเพิ่งคัดลอกมันเป็น/usr/local/bin/g(ใช่ฉันใช้มันมาก)


2
ทำไมไม่ใช้ฟังก์ชั่นของเชลล์สำหรับสิ่งนี้? g() { grep --color=always -r "$@" . | less -R }ทำงานเหมือนกันและอาจจะให้ประสิทธิภาพที่ดีขึ้น (อย่างน้อย)
00dani

1
@ 00dani ใช่นั่นเป็นทางเลือกที่ถูกต้องเช่นกันและบางครั้งฉันก็ใช้ โปรดทราบว่าในกรณีนี้ใช้เวลาส่วนใหญ่ใน IO ดังนั้นจึงไม่มีการเพิ่มประสิทธิภาพที่สามารถรับรู้ได้ :) ความแตกต่างอีกอย่างหนึ่งก็คือใน PATH ของคุณสคริปต์นี้สามารถใช้กับเชลล์สคริปต์และชื่อแทนอื่น ๆ ได้เช่นกัน ฟังก์ชันจะต้องโหลดอย่างชัดเจนแทน
Iazel

1

อย่าใช้นามแฝงว่า "grep" ควรใช้นามแฝงว่า "less" ซึ่งเชลล์ไม่เคยใช้ ในสิ่งที่คุณ.bashrcเพิ่งใส่: alias less="less -r".


3
ไม่ถูกต้องนัก หนึ่งต้องใช้ทั้งสอง และgrep --color=always less -Rโปรดทราบว่า grep รู้เพียงว่ามันถูกส่งไปยังกระบวนการอื่นและ--color=autoตัวเลือกใช้ข้อมูลนี้เพื่อตัดสินใจว่าจะให้สีออกมาหรือไม่
brandizzi

3
โปรดทราบว่าlessตัวเลือกที่จะแตกต่าง-r -Rอาจ-Rจะปลอดภัยกว่า
Craig McQueen

1
เหตุใดจึงต้องลงคะแนนโซลูชันของฉัน OP ขอเฉพาะlessตัวอย่างพร้อมใช้ตัวเลือก `--color 'แล้ว
not2qubit

3
นามแฝงอาจไม่พึงประสงค์ที่นี่ lessรองรับ$LESSตัวแปรสภาพแวดล้อม ดังนั้นแทนที่จะเป็นนามแฝงexport LESS='-R'อาจจะดีกว่า
greyfade

0

ฉันต้องวิ่ง

grep --color=always -R "search string" * | less - r

ด้วยแฟล็ก -rหลังจากน้อยกว่าเพื่อให้สิ่งนี้รัน


อะไร*ทำอย่างไร จากหน้า man of grep: *: The preceding item will be matched zero or more times.แต่ฉันก็ยังไม่เข้าใจ .. !
Shayan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.