ฉันจะเน้นการจับคู่ด้วย GNU grep ได้อย่างไร


18

ฉันเคยเห็นบน Linux บางตัวที่ได้grepรับการกำหนดค่าเพื่อเน้นการจับคู่และพิมพ์ไฟล์ที่ตรงกัน

ฉันgrepจะกำหนดค่าเพื่อเน้นการจับคู่ได้อย่างไร

คำตอบ:


10
alias cgrep='grep -nR --color'

การใช้งาน:

$ cgrep somestring /path/to/dir/or/file/with*/possible/*wild.card

ยังเป็นหนึ่งในรายการโปรดของฉัน:

$ pgrep some-hanging-process

จะแสดงรายการของกระบวนการทั้งหมดที่ตรงกับชื่อของบางกระบวนการที่คุณสามารถใช้ในสถานการณ์ต่อไปนี้:

$ kill $(pgrep some-hanging-process)

12
มีคำสั่ง pkill สำหรับอันสุดท้าย
diega

1
กับรุ่นล่าสุดของ GNU grep, grep -rทั่วไปควรที่ต้องการมากกว่าgrep -Rเป็นอดีตไม่ได้สำรวจ symlinks
Stéphane Chazelas

19

ฉันพบว่าวิธีที่ดีที่สุดในการแมงดา grep คือการใช้ackซึ่งเป็นหลัก grep recursive กับรายการละเว้นอัจฉริยะ (เช่นไม่ค้นหาไดเรกทอรี. svn ละเว้นไฟล์สำรอง ฯลฯ ) การเน้นสีของผลลัพธ์และ Perl regexps เป็นสิ่งที่คุณต้องการให้ grep ทำ 98.6% ของเวลา


5
+1 สำหรับการกล่าวถึง ack อย่าลืมที่จะรวมตัวเลือก --pager = "less -R" เพื่อรักษาการบำรุงรักษาที่ไฮไลต์เพื่อให้ได้ผลลัพธ์ อาจเป็นสิ่งที่ควรค่าแก่การกล่าวถึงใน Ubuntu มันถูกเรียกว่า "ack-grep" เนื่องจากมีการเรียกใช้ "ack"
Shawn Chin

ฉันใช้ ack เช่นกัน แต่บางครั้งคุณก็ไม่สามารถใช้ได้ ..
elmarco

2
เนื่องจาก ack เป็นเพียงสคริปต์ Perl คุณสามารถทำให้ใช้ได้ทุกที่ที่คุณติดตั้ง Perl ซึ่งไม่ใช่แถบสูง
ไก่

Ack นั้นดีสำหรับค่าเริ่มต้นที่ไม่อยู่ในกล่อง แต่ในเวลาที่คุณต้องทำการติดตั้ง ack คุณสามารถกำหนดค่าเริ่มต้นสำหรับ grep ได้ - ดูคำตอบของฉันที่อื่นในหน้านี้ ฉันทำสิ่งนี้ครั้งเดียวในปี 1980 และตั้งแต่นั้น grep ได้ทำทุกสิ่งที่แอ๊ทำได้ (เฉพาะ grep เท่านั้นที่เร็วกว่าจริงแม้ว่าจะมีการเรียกร้องที่ดังของแอ๊ก)
Jonathan Hartley

7

ฉันตั้งค่านี้ใน. bashrc ของฉันแทนการกำหนด grep ใหม่โดยใช้นามแฝง:

    export GREP_OPTIONS="--color=auto"

สำหรับฉันมันใช้ได้กับ Linux, MacOSX และ FreeBSD


GREP_OPTIONSควรได้รับการพิจารณาว่าเป็นอันตราย ฉันแนะนำให้ใช้aliasแทน ดูที่นี่: bugs.launchpad.net/ubuntu/+bug/67141
lesmana

ฉันยอมรับว่า GREP_OPTIONS อาจมีปัญหาในบางสคริปต์ แต่ตามที่ฉันถกเถียงกันในข้อผิดพลาด 67141 , GREP_OPTIONS อนุญาตให้ผู้ใช้ตั้งค่าหนึ่งตัวเลือกสำหรับ grep หลายรูปแบบ (grep, egrep, fgrep, rgrep, zgrep, bzgrep, bzfgrep, bzegrep ฯลฯ ) ในขณะที่นามแฝงจะต้องตั้งค่าสำหรับ * grep ทุกรูปแบบและมี grep หลายประเภท
Stefan Lasiewski

ฉันเคยใช้ GREP_OPTIONS มานานหลายปี (ไม่ได้หลายสิบปี) แต่ความเสียหายที่เกิดขึ้นนั้นเป็นเรื่องจริงมาก เครื่องมือใด ๆ ที่เรียกใช้ grep ด้วยชุด env var นี้จะสืบทอดพฤติกรรมเริ่มต้นที่คุณแก้ไขและสิ่งนี้จะทำให้เครื่องมือเหล่านั้นพัง หลีกเลี่ยงปัญหานี้อย่างสิ้นเชิงโดยการกำหนดนามแฝงหรือสคริปต์ wrapper ที่ปฏิบัติการได้แทน
Jonathan Hartley

สคริปต์จะต้องทำให้สภาพแวดล้อมของพวกเขาถูกสุขลักษณะ ไม่อนุญาตให้ใช้ ifs buts หรือ howevers ระยะเวลา (ใช่มันเป็นอาการปวดหลังส่วนล่าง ... )
vonbrand

3

ฉันขอแนะนำให้หลีกเลี่ยงตัวแปรสภาพแวดล้อม GREP_OPTIONS ซึ่งจะส่งผลต่อการเรียกใช้ grep ทุกครั้งแม้จะฝังอยู่ภายในเครื่องมืออื่น ๆ หากเครื่องมือเหล่านั้นคาดว่า grep จะทำงานในทิศทางเดียวและคุณเปลี่ยนพฤติกรรมนั้นมันจะทำและทำลายเครื่องมือเหล่านั้น

แต่คุณสามารถสร้างนามแฝงซึ่งทำงานได้ดี สิ่งนี้จะส่งผลกระทบต่อการโทรไปที่ grep จากเชลล์เชิงโต้ตอบของคุณเท่านั้น (นั่นคือคุณพิมพ์เอง)

ตัวเลือกสุดท้ายที่ฉันชอบที่สุดคือสร้างสคริปต์ตัวตัดคำที่เรียกใช้ grep ฉันชอบสิ่งนี้มากกว่านามแฝงเพราะฉันสามารถเรียกใช้ wrapper นี้จากโปรแกรมอื่น เช่นในกลุ่มโดยการตั้งค่า vimgrep ดังนั้นการค้นหาของฉันจากภายในกลุ่มจะทำงานเหมือนกับการค้นหาที่บรรทัดคำสั่ง

$ cat `which grp`
#!/usr/bin/env bash
grep -rI --color --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude=tags $*

เรียกใช้สิ่งนี้โดยใช้:

$ grp pattern dir

เช่น

$ grp pattern .

จะค้นหาตัวอย่างของ 'pattern' ในไฟล์ข้อความทั้งหมดใน dir และ subdirs ปัจจุบัน

โปรดสังเกตว่าฉันเรียกสคริปต์ของฉันว่า "grp" แทนที่จะเป็น "grep" แชโดว์เพื่อให้ฉันรู้อยู่เสมอว่าฉันกำลังเรียกใช้ grep ด้วยค่าเริ่มต้นที่กำหนดเองหรือไม่

โดยค่าเริ่มต้นฉันรวม:

-r : search subdirs recursive
-I : skip binary files
--color : highlight matches in color
--exclude-dir : skip specified directories and their subdirs
--exclude : skip specified files

ฉันคิดว่าทุกคนต้องการข้ามการควบคุมแหล่งที่มา: .hg .git .bzr .svn

การข้าม 'build' และ 'dist' เป็น Python-isms และอาจไม่เหมาะกับคนส่วนใหญ่ ไม่ต้องสงสัยเลยว่าคุณจะพัฒนานิสัยแปลก ๆ ของตัวเองเมื่อคุณทำงาน

'tags' เป็นผลลัพธ์ของ ctags ที่ฉันใช้สำหรับ 'go to function definition' และ like in in tools เช่น vim ด้วยเหตุนี้จึงมีสำเนาทุกคำและสัญลักษณ์อย่างน้อยหนึ่งรายการจากซอร์สโค้ดของฉันดังนั้นจึงควรข้ามจากผลการค้นหาของคุณ

"$ *" ที่ท้ายสุดคือ bash syntax สำหรับ "และ params อื่น ๆ จาก command-line" ดังนั้นคุณสามารถผ่านในรูปแบบและ dir เพื่อค้นหาตามปกติและแทนที่ค่าสถานะบรรทัดคำสั่งอื่น ๆ ที่คุณต้องการ .


2

--colorตัวเลือกที่ได้รับการกล่าวถึงแล้วหลายครั้ง แต่ผมอยากจะเพิ่มว่ามันเป็นไปได้ที่จะกำหนดค่าสีที่ตรงกับที่จะมีการเน้นการใช้ตัวแปรสภาพแวดล้อม

export GREP_COLOR="1;33"

ควรเข้ารหัสสีโดยใช้รหัสสี ANSI สำหรับการอ้างอิง

Black       0;30     Dark Gray     1;30
Blue        0;34     Light Blue    1;34
Green       0;32     Light Green   1;32
Cyan        0;36     Light Cyan    1;36
Red         0;31     Light Red     1;31
Purple      0;35     Light Purple  1;35
Brown       0;33     Yellow        1;33
Light Gray  0;37     White         1;37

1
GREP_COLORเลิกใช้แล้ว ใช้GREP_COLORSแทน
g33kz0r

2

เนื่องจากฉันไม่เห็นตัวอย่างของการตั้งค่าสีจริง ๆ นี่คือการตั้งค่าอย่างง่ายสำหรับ grep GNU:

# turn on colors, natch.
export GREP_OPTIONS="--color=auto"

if [[ $(echotc Co) -ge 256 ]]; then
  # 256 color terminals
  export GREP_COLORS="mt=38;5;118:sl=:cx=:fn=38;5;18:ln=1;30:bn=37:se=30"
else
  # everybody else
  export GREP_COLORS="mt=31:sl=:cx=:fn=34:ln=1;30:bn=30:se=30"
fi

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

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