ฉันพยายามเรียกคำสั่ง grep แต่ละคำเพื่อเน้นว่าผลลัพธ์เป็นสีที่ต่างกัน ฉันสามารถทำได้ด้วยตนเองโดยใช้บรรทัดดังนี้:
ls -l GREP_COLORS='mt=01;32' grep c | GREP_COLORS='mt=01;31' grep o | GREP_COLORS='mt=01;34' grep n | GREP_COLORS='mt=01;36' grep f
c
ตัวละครทุกตัวจะถูกเน้นด้วยสีเขียวและo
ตัวละครทุกตัวจะถูกเน้นด้วยสีแดง ฯลฯ ...
เพื่อให้ตัวอย่างนี้ทำงานคุณจะต้องแน่ใจว่าคุณมี
--color=always
คำสั่ง grep อยู่เสมอ ฉันได้ตั้งค่านี้ใน.bashrc
grep ของฉันดังนั้นจะมีสี:
export GREP_OPTIONS='--color=always'
สิ่งที่ฉันพยายามทำให้สำเร็จคือห่อฟังก์ชันนี้ด้วยนามแฝงเพื่อให้ฉันสามารถโทรได้ grep
และมีGREP_COLORS
ค่าที่แตกต่างกันในแต่ละครั้ง ฉันเข้าใจการพิจารณาของเชลล์จำนวนมากสำหรับ grep piped ใหม่แต่ละอันและฉันพยายามทำสิ่งนี้โดยการสร้างไฟล์บางไฟล์ (หนึ่งสำหรับแต่ละสี) เพื่อระบุว่าพวกมันถูกใช้ไปแล้ว
ฉันได้พยายามมาบ้างแล้ว แต่ก็แปลกแล้วอันนี้ดูเหมือนจะทำงานได้ดีที่สุด ฉันมีสิ่งนี้ในของฉัน.bashrc
:
alias mg="mygrep"
mygrep(){
# define possible colors
COLORS=("01;32" "01;31" "01;34" "01;36")
COUNTER=0
NUM=0
# as long as the color has already been used, keep searching
while [ -f /home/lior/Desktop/mygrep_$NUM ]; do
# get a random index
let NUM=`shuf --input-range=0-$(( ${#COLORS[*]} - 1 )) | head -1`
wait ${!}
$(( COUNTER+=1 ))
if [ "$COUNTER" -ge ${#COLORS[@]} ]; then
# remove all color locks
rm /home/lior/Desktop/mygrep_*
wait ${!}
fi
done
# mark this color as used
touch /home/lior/Desktop/mygrep_$NUM
wait ${!}
# lets go!
GREP_COLORS="mt=${COLORS[$NUM]}" grep "$@"
}
ฉันใช้นามแฝงเช่นนี้:
ll | mg c | mg o | mg n | mg f
ผลลัพธ์ค่อนข้างเย็น อย่างไรก็ตามมีข้อผิดพลาดบางอย่างที่แตกต่างกันเล็กน้อยในแต่ละครั้ง นี่คือภาพหน้าจอสองสามภาพ:
ดูเหมือนว่าเชลล์จะผ่านแต่ละคำสั่งไพพ์ฟังก์ชันก่อนหน้านี้ยังไม่เสร็จสิ้นการดำเนินการ พยายามลบไฟล์ที่ไม่มีอยู่อีกต่อไป ฉันไม่แน่ใจว่าcommand not found
ข้อผิดพลาดอื่น ๆมาจากที่ใด
อย่างที่คุณเห็นฉันมีบางอย่าง wait
คำสั่งเพื่อให้การจัดการไฟล์เสร็จสมบูรณ์ แต่สิ่งนี้ดูเหมือนจะไม่ทำงานได้ดีเกินไป อีกสิ่งที่ฉันได้ลองแล้วคือการใช้หน่วยความจำที่ใช้ร่วมกัน/dev/shm
แต่ให้ผลลัพธ์ที่คล้ายกัน
ฉันจะไปเกี่ยวกับการรับผลลัพธ์ที่ฉันต้องการได้อย่างไร
บันทึก:
ฉันกำลังมองหาคำตอบที่แค่หุ้มคำสั่ง grep เพราะมันมีฟังก์ชั่นมากมายที่ฉันต้องการใช้และตั้งใจจะใส่ตรรกะอื่น ๆ ระหว่างไพพ์ดังนั้นฉันจึงไม่ต้องการให้คำค้นหาทั้งหมดพร้อมกัน ฉันไม่ต้องการเครื่องมืออื่น ๆ เช่น "grep like" ขออภัยที่@terdonผู้ได้โพสต์คำแนะนำที่ยอดเยี่ยมไว้แล้ว
alias mg="mygrep; grep"
ไหม
mygrep;
คำสั่งใหม่ในตัวของมันเองและกระแสข้อมูลก็หายไป ไปป์ที่เข้ามาจากls
จะถูกส่งผ่านไปยังmygrep;
และไม่ให้ grep อย่างน้อยนั่นเป็นวิธีที่ฉันเข้าใจ
--color=always
คำสั่ง grep ทั้งหมดของคุณ .bashrc
ฉันได้ตั้งที่ทั่วโลกในของฉัน ฉันแก้ไขที่โพสต์