จับคู่สตริงที่แน่นอนโดยใช้ grep


63

ฉันมีไฟล์ข้อความ:

deiauk 1611516 afsdf 765
minkra 18415151 asdsf 4152
linkra sfsfdsfs sdfss 4555
deiauk1 sdfsfdsfs 1561 51
deiauk2 115151 5454 4
deiauk 1611516 afsdf ddfgfgd
luktol1 4545 4 9
luktol 1

deiaukและฉันต้องการที่ตรงกับ เมื่อฉันทำสิ่งนี้:

grep "deiauk" file.txt

ฉันได้รับผลลัพธ์นี้:

deiauk 1611516 afsdf 765
deiauk1 sdfsfdsfs 1561 51
deiauk2 115151 5454 4

แต่ฉันต้องการเพียงสิ่งนี้:

deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

ฉันรู้ว่ามี-wตัวเลือก แต่จากนั้นสตริงของฉันจะต้องควบคุมทั้งบรรทัด


4
คุณลองจริงgrep -wหรือ (ตัวเลือกนั้นมีไว้สำหรับวัตถุประสงค์นั้นและทำงานได้สำหรับฉัน) - หมายเหตุ: ตัวเลือก-xตรงกับทั้งบรรทัด
Janis

"ฉันต้องการจับคู่ที่ตรงกันdeiauk / " ฉันต้องการสิ่งนี้เท่านั้น: deiauk 1611516 afsdf 765" - คุณต้องการอันไหน
อเล็กซ์

คำตอบ:


127

ลองหนึ่งใน:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile

3
หากคุณมีเส้นประ ( - ) ที่ท้ายของสตริงสคริปต์นี้จะนำมาซึ่งผลซึ่งไม่ได้คาดหวัง
Evis

ถูกต้อง @Evert: คำต่างๆรวมถึงตัวอักษรอัลฟ่าตัวเลขและเครื่องหมายขีดล่างเท่านั้นดังนั้นหากคุณมีตัวย่อหรือรายการที่ใส่เครื่องหมายขีดคั่นไว้สิ่งนี้จะไม่ทำงาน
ingyhere

@Cyrus ฉันเรียนรู้สิ่งที่สองขณะที่ใช้*คำสั่งvi / vim กับคำพูด
shuva

มันไม่ทำงานสำหรับตัวละครพิเศษใด ๆ ที่มันมีตัวอย่างเช่นorg.apache.avro avrogreped ด้วยorg.apache.avro avro+mapred(ลองด้วย *)
Vishrant

12

ลองทำสิ่งนี้กับ GNU grepและทำเครื่องหมายขอบเขตของคำด้วย\b:

grep "\bdeiauk\b" file

เอาท์พุท:

deiauk 1611516 afsdf 765

ดู: http://www.regular-expressions.info/wordboundaries.html


ขอบคุณ แต่ทำไมมันไม่ทำงานสำหรับฉัน echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
user3334375

ลองgrep "\b${vard}\b" file.txt
Cyrus

1
ยังคงใช้งานไม่ได้: /
3334375

คุณจะต้องread:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Cyrus

7

หากgrepรองรับ-P(PCRE) คุณสามารถทำได้:

$ grep -P '(^|\s)\Kdeiauk(?=\s|$)' file.txt 
deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

4
นี่เป็นคำตอบเดียวที่ทำงานกับคำที่ใส่ยัติภังค์
ingyhere

5

คุณสามารถค้นหาคำตามด้วยช่องว่างทั้งนี้ขึ้นอยู่กับข้อมูลจริงของคุณ:

grep 'deiauk ' file.txt 

ถ้าคุณรู้ว่ามันจะต้องเป็นจุดเริ่มต้นของบรรทัดตรวจสอบมัน:

grep '^deiauk ' file.txt 

น่าเศร้าคำตอบทั้งหมดนอกเหนือจากนี้ไม่ถูกต้อง
Shatu

@ Shatu ขอบคุณ! ลองดูว่าใช้เวลานานแค่ไหนในการ "เพิ่มฟองขึ้นไปด้านบน" ... ฉันอยากรู้อยากเห็นเพราะฉันต้องการเพิ่มคำตอบสำหรับคำถามเก่า ๆ ... ฉันคิดว่ามันน่าจะเป็นไปได้ แต่ฉันสงสัย มันจะดีสำหรับฉัน แต่จริงๆแล้วมีประโยชน์สำหรับผู้อ่าน เพื่อให้เป็นกรณีตัวอย่างที่ดีฉันขอให้คุณเขียนความคิดเห็นสรุปสิ่งที่คำตอบอื่นหายไปได้หรือไม่
Volker Siegel

(1) ขอแสดงความยินดีกับการเข้าถึงตัวแทน 10K ตอนนี้คุณมีสิทธิ์เห็นว่าได้รับคำตอบนี้มาก่อนและถูกลบไปแล้ว (2) ดีกว่าเสมอที่จะตอบคำถามให้กว้างที่สุดเท่าที่จะทำได้โดยอิงจากสิ่งที่พูดและไม่ให้คำตอบที่ใช้ได้กับข้อมูลตัวอย่าง ปรากฏขึ้นจากข้อมูลตัวอย่างในคำถามที่ว่าคอลัมน์ถูกคั่นด้วยช่องว่าง - แต่ไม่ได้ระบุ คำตอบอื่น ๆ ทั้งหมดจะใช้ได้กับคอลัมน์ที่คั่นด้วยแท็บ (3) คุณหลีกเลี่ยงข้อบกพร่องร้ายแรงในคำตอบ (ลบ) ของ tachomi โดยการเพิ่ม^- แต่คำตอบอื่น ๆ ทั้งหมดทำงาน ... (ต่อ)
G-Man

(ต่อ) ถ้าสตริงปรากฏในฟิลด์อื่นที่ไม่ใช่ฟิลด์แรก (4) นอกจากนี้คำตอบอื่น ๆ ทั้งหมดยังใช้งานได้หาก '' deiauk '' เป็นฟิลด์สุดท้าย (เช่นไม่มีอะไรหลังจากนั้น)
G-Man
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.