Grep สำหรับสตริงตามตัวอักษร


103

ฉันใช้เครื่องมือประเภท grep เพื่อค้นหาสตริงตามตัวอักษรล้วนๆ ฉันกำลังมองหาการเกิดขึ้นของบรรทัดของไฟล์บันทึกซึ่งเป็นส่วนหนึ่งของบรรทัดในไฟล์บันทึกแยก ค้นหาข้อความที่สามารถมีทุกประเภทของตัวอักษรพิเศษ regex []().*^$-\เช่น

มียูทิลิตี้การค้นหา Unix ที่ไม่ใช้ regex แต่เพียงแค่ค้นหาการเกิดขึ้นจริงของสตริงหรือไม่?


สงสัยว่าทำไมคำถามถึงไม่"ฉันgrepค้นหาสตริงตามตัวอักษรได้หรือไม่" แทนที่จะเป็น"มีอะไรแบบนี้บ้างgrepที่สามารถค้นหาสตริงตามตัวอักษร" ไขควงหัวแบนสามารถใส่กับหัวสกรูของ Philips ได้;)
ADTC

คำตอบ:


138

คุณสามารถใช้ grep สำหรับสิ่งนั้นด้วยตัวเลือก -F

-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings

"newline-separate fixed strings"ฉันจะทำสิ่งนี้บนพร้อมท์เทอร์มินัลได้อย่างไร ฉันรู้ว่าฉันสามารถสร้างไฟล์รูปแบบได้ แต่ไม่มีไฟล์เป็นไปได้ไหมที่จะทำในพรอมต์ การกด Enter เป็นการดำเนินการคำสั่งอย่างเห็นได้ชัด
ADTC

13
ฉันจะตอบคำถามของตัวเอง :)คุณเพียงแค่ต้องระบุสตริงคงที่หลายรายการโดยใช้-eตัวเลือกซ้ำ เช่นนี้: grep -F -e "fixed1" -e "fixed2" -e "fixed3" -e "fixed4". ไม่ต้องขึ้นบรรทัดใหม่)
ADTC

2
ไม่มีใน Solaris แต่fgrepถูกนำมาใช้
majkinetor

2
@ADTC ฉันพบว่าฉันต้องใช้เครื่องหมายคำพูดเดี่ยวสำหรับสตริงการค้นหาที่มีอักขระพิเศษเท่านั้นไม่พบสิ่งใด ดังนั้นสิ่งนี้จึงไม่ได้ผลลัพธ์ใด ๆ : grep --include=\*.php -FRn -e "$$"การใช้ quoutes เดี่ยวทำให้ฉันได้ผลลัพธ์ที่ต้องการ:grep --include=\*.php -FRn -e '$$'
Piemol

2
คุณมีความถูกต้อง @ADTC $และอักขระอื่น ๆ อีกสองสามตัวมีความพิเศษและจะถูกแทนที่ด้วย bash หลังจากที่คุณกด Enter และก่อนหน้าgrep(หรือคำสั่งใด ๆ ) จะถูกเรียกใช้ คุณสามารถบอกให้ bash ปล่อยให้อักขระทั้งหมด (ยกเว้นเครื่องหมายคำพูดเดียว) โดยไม่ถูกแตะต้องโดยใส่ไว้ในเครื่องหมายคำพูดเดี่ยว หากคุณต้องการพิมพ์คำพูดเดียวให้ทำเช่นนี้'I'\''m special'
ndemou

15

นั่นคืออย่างใดอย่างหนึ่งfgrepหรือgrep -Fที่จะไม่ทำนิพจน์ทั่วไป fgrepเหมือนกันgrep -Fแต่ฉันไม่ต้องการที่จะต้องกังวลเกี่ยวกับข้อโต้แย้งขี้เกียจภายใน :-)

grep   ->  grep
fgrep  ->  grep -F  (fixed)
egrep  ->  grep -E  (extended)
rgrep  ->  grep -r  (recursive, on platforms that support it).

สำหรับ GNU grep fgrep มีให้เป็น symlink ไปยัง grep ซึ่งทำให้ใช้เวลา -F
Daenyth

3
egrepและfgrepไม่ได้ระบุโดยมาตรฐาน POSIX grep -Fและgrep -E เป็น
Richard Hansen


3

คุณยังสามารถใช้ awk ได้เนื่องจากมีความสามารถในการค้นหาสตริงคงที่รวมถึงความสามารถในการเขียนโปรแกรมเช่นเท่านั้น

awk '{for(i=1;i<=NF;i++) if($i == "mystring") {print "do data manipulation here"} }' file

2
cat list.txt
one:hello:world
two:2:nothello

three:3:kudos

grep --color=always -F"hello

three" list.txt

เอาท์พุท

one:hello:world
three:3:kudos

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