grep สำหรับอักขระพิเศษใน Unix


95

ฉันมีไฟล์บันทึก (application.log) ซึ่งอาจมีสตริงอักขระปกติและอักขระพิเศษต่อไปนี้ในหลายบรรทัด:

*^%Q&$*&^@$&*!^@$*&^&^*&^&

ฉันต้องการค้นหาหมายเลขบรรทัดที่มีสตริงอักขระพิเศษนี้

grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

คำสั่งดังกล่าวไม่ส่งคืนผลลัพธ์ใด ๆ

อะไรคือไวยากรณ์ที่ถูกต้องในการรับหมายเลขบรรทัด?


^@: หมายถึง^ตามด้วย@หรือ nul ตัวอักษร?
Nahuel Fouilleul

คำตอบ:


159

บอกgrepให้ถือว่าอินพุตของคุณเป็นสตริงคงที่โดยใช้-Fตัวเลือก

grep -F '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

-nจำเป็นต้องมีตัวเลือกเพื่อรับหมายเลขบรรทัด

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

7
ทั้งนี้ขึ้นอยู่กับรุ่นของ grep คุณต้องการเพียงที่จะหลบหนี (มีเครื่องหมาย) ^, $, ., และ* \ หรือจะลองดูfgrepก็ได้
Nahuel Fouilleul

2
@NahuelFouilleul: +1. btw fgrepเหมือนกับgrep -F.
Prince John Wesley

@PrinceJohnWesley: มันเหมือนกัน แต่ในบางระบบมี grep หลายเวอร์ชันดังนั้นการใช้ fgrep อาจพบเวอร์ชันที่รองรับ -F
Nahuel Fouilleul

ถ้าเขาใช้egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.logล่ะ?
inckka

ไม่ทำงาน พิมพ์grep -rinF '-static' คำตอบInvalid option «t»ของ @ Mani ใช้ได้ผลเช่น. grep -rin "\-static"
Hi-Angel

93

สิ่งที่เหมาะกับฉันคือ:

grep -e '->'

-e หมายความว่าอาร์กิวเมนต์ถัดไปคือรูปแบบและจะไม่ถูกตีความว่าเป็นอาร์กิวเมนต์

จาก: http://www.linuxquestions.org/questions/programming-9/how-to-grep-for-string-769460/


str = '! "# $% & () * +, -. /:; <=>? @ [\] ^ _` {|} ~ '; echo "$ str" | grep -e "$ str" ..... ไม่ทำงานสิ่งที่ใช้ได้ผลสำหรับคุณไม่มีอักขระพิเศษเพียงพอนอกจากเครื่องหมายสวิตช์ '-' แต่ win -F แทนที่จะเป็น -e กำลังทำงาน!
THESorcerer

1
สิ่งเดียวที่ใช้ได้ผลสำหรับฉันแม้แต่ "\" หรือ -F หรือ fgrep ก็ไม่ได้ผล ขอบคุณ!
user180574

2
นี่ควรเป็นคำตอบที่ยอมรับ - ง่ายและใช้ได้ผลกับ grep
Ishay Peled

1
พยายาม -F และ fgrep ไม่ได้ผลสำหรับฉันเมื่อค้นหาสตริงรวมถึงอักขระ '-' นี้ได้ผล
世界知名伟人

ฉันสงสัยว่าทำไมคำตอบนี้จึงมีอยู่ในคำถามนี้ ( stackoverflow.com/q/12387685สำหรับการอ้างอิงถึงคำถาม & คำตอบที่ฉันกำลังดูอยู่) - อาจเป็นกรณีที่ไม่ถูกต้องของคำตอบที่รวมจากคำถามอื่น หากต้องการค้นหารูปแบบที่ขึ้นต้นด้วย-โปรดดูstackoverflow.com/questions/2427913/…
อาทิตย์

6

หมายเหตุที่เกี่ยวข้อง

ในการ grep สำหรับการกลับรถคือ\rตัวละครหรือ0x0dเราสามารถทำได้:

grep -F $'\r' application.log

หรือใช้printfหรือechoเพื่อความเข้ากันได้ของ POSIX

grep -F "$(printf '\r')" application.log

และเราสามารถใช้hexdumpหรือlessเพื่อดูผลลัพธ์:

$ printf "a\rb" | grep -F $'\r' | hexdump -c
0000000   a  \r   b  \n

เกี่ยวกับการใช้งาน$'\r'และอักขระที่รองรับอื่น ๆ โปรดดูBash Manual> ANSI-C Quoting :

คำในรูปแบบ $ 'string' ได้รับการปฏิบัติเป็นพิเศษ คำขยายเป็นสตริงโดยแทนที่อักขระที่ใช้เครื่องหมายแบ็กสแลชจะถูกแทนที่ตามที่ระบุโดยมาตรฐาน ANSI C



2

คุณสามารถลองลบอักขระที่เป็นตัวเลขและตัวอักษรและช่องว่าง จากนั้นใช้-nจะให้หมายเลขบรรทัด ลองทำตาม:

grep -vn "^[a-zA-Z0-9 ]*$" application.log


ขอบคุณ .. เป็นเรื่องที่ดีสำหรับฉันที่จะค้นหาอักขระพิเศษจากไฟล์
Dipankar Nalui

-4

ลองใช้ vi ด้วยตัวเลือก -b สิ่งนี้จะแสดงอักขระท้ายบรรทัดพิเศษ (ฉันมักจะใช้เพื่อดูการสิ้นสุดบรรทัดของ windows ในไฟล์ txt บนระบบปฏิบัติการยูนิกซ์)

แต่ถ้าคุณต้องการโซลูชันที่มีสคริปต์อย่างชัดเจน vi จะไม่ทำงานดังนั้นคุณสามารถลองใช้ตัวเลือก -f หรือ -e ด้วย grep และไพพ์ผลลัพธ์เป็น sed หรือ awk จากหน้า grep man:

Matcher Selection -E, --extended-regexp ตีความรูปแบบเป็นนิพจน์ทั่วไปแบบขยาย (ERE ดูด้านล่าง) (-E ระบุโดย POSIX)

   -F, --fixed-strings
          Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.  (-F is specified
          by POSIX.)

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