ฉันมีสิ่งเหล่านี้:
$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123
ฉันต้องการหา ABB.log ที่ตรงกันทุกประการ
แต่เมื่อฉันทำ
$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123
มันแสดงให้เห็นทั้งหมด
ได้สิ่งที่ต้องการโดยใช้ grep หรือไม่?
ฉันมีสิ่งเหล่านี้:
$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123
ฉันต้องการหา ABB.log ที่ตรงกันทุกประการ
แต่เมื่อฉันทำ
$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123
มันแสดงให้เห็นทั้งหมด
ได้สิ่งที่ต้องการโดยใช้ grep หรือไม่?
คำตอบ:
เพียงระบุจุดยึด regexp
grep '^ABB\.log$' a.tmp
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
grep -Fx ABB.log a.tmp
จากหน้า grep man:
-F, --fixed-strings
ตีความรูปแบบเป็น (รายการ) สตริงคงที่
-x, --line-regexp
เลือกเฉพาะการจับคู่ที่ตรงกับบรรทัดทั้งหมด
-F
? คุณอยู่ที่ Solaris หรือเปล่า? ถ้าเป็นเช่นนั้นให้ใช้/usr/xpg4/bin/grep
grep
ภายในสคริปต์ทุบตีและตัวเลือกนี้ดีกว่าใช้นิพจน์ทั่วไปตามที่แนะนำในคำตอบที่ยอมรับ เนื่องจากฉันมีอักขระพิเศษบางตัวในตัวแปรที่ฉันกำลังค้นหา (เช่น.
) และฉันไม่จำเป็นต้องหลบหนีเมื่อใช้คำสั่ง
นี่คือสิ่งที่ฉันทำแม้ว่าการใช้แองเคอจะเป็นวิธีที่ดีที่สุด:
grep -w "ABB.log " a.tmp
ABB.log
นั้นซึ่งไม่ใช่กรณีทั่วไปกล่าวคือมันจะล้มเหลวเกือบตลอดเวลา
คำแนะนำส่วนใหญ่จะล้มเหลวหากมีช่องว่างนำหน้าหรือต่อท้ายมากพอ ๆ กันซึ่งจะมีความสำคัญหากไฟล์ถูกแก้ไขด้วยมือ สิ่งนี้จะทำให้อ่อนแอน้อยลงในกรณีนั้น:
grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp
ลูปในขณะอ่านอย่างง่ายในเชลล์จะทำสิ่งนี้โดยปริยาย:
while read file
do
case $file in
(ABB.log) printf "%s\n" "$file"
esac
done < a.tmp
ในทำนองเดียวกันกับ awk
awk '/^ABB\.log$/' file
ฉันตั้งใจจะเพิ่มคำอธิบายเพิ่มเติมเกี่ยวกับความพยายามของ OP และคำตอบอื่น ๆ ด้วย
คุณสามารถใช้โซลูชันของ John Kugelmansเช่นนี้ได้เช่นกัน:
grep -x "ABB\.log" a.tmp
การอ้างถึงสตริงและการหลีกเลี่ยงจุด ( .
) ทำให้ไม่ต้องการ-F
แฟล็กอีกต่อไป
คุณต้องหลีกเลี่ยง.
(จุด) (เนื่องจากตรงกับอักขระใด ๆ (ไม่เพียง แต่.
) หากไม่ใช้ Escape) หรือใช้-F
แฟล็กกับ grep -F
แฟล็กทำให้เป็นสตริงคงที่ (ไม่ใช่นิพจน์ทั่วไป)
หากคุณไม่อ้างถึงสตริงคุณอาจต้องใช้แบ็กสแลชคู่เพื่อหลีกเลี่ยงจุด ( .
):
grep -x ABB\\.log a.tmp
$ echo "ABBElog"|grep -x ABB.log
ABBElog #matched !!!
$ echo "ABBElog"|grep -x "ABB\.log"
#returns empty string, no match
-x
บังคับให้ตรงกันทั้งเส้น.
โดยไม่มี-F
แฟล็กนั้นผิด-x
สวิทช์โดยการตัดสตริงรูปแบบของคุณด้วยและ^
$
ในกรณีนี้ทำให้แน่ใจว่าคุณไม่ได้ใช้-F
แทนหลบหนี.
เพราะ-F
จะป้องกันการตีความ regex ของและ^
$
หากคุณต้องการจับคู่สตริงที่ขึ้นต้นด้วย-
คุณควรใช้--
กับ grep สิ่งที่ตามมา--
จะถูกนำมาเป็นอินพุต (ไม่ใช่ตัวเลือก)
ตัวอย่าง:
echo -f |grep -- "-f" # where grep "-f" will show error
echo -f |grep -F -- "-f" # whre grep -F "-f" will show error
grep "pat" -- "-file" # grep "pat" "-file" won't work. -file is the filename
-F
ไม่จำเป็นถ้า.
มีการหลบหนีอย่างถูกต้อง
-F
ว่างเมื่อคุณเขียนสิ่งนี้หรือไม่? ถ้าไม่คุณใช้ระบบใด ฉันไม่พบข้อมูลดังกล่าวในคำตอบของคุณซึ่งตอนนี้ก็ยังเป็นเช่นนั้นเมื่อฉันอ่านซ้ำอีกครั้ง แน่ใจจริงๆฉันอ่านคำตอบของคุณทั้งหมดอย่างน้อยสองครั้ง ;)
-F
สามารถใช้ได้ (ฉันพูดว่า: "หรือใช้-F
ธงกับgrep
")
-F
เป็นคำตอบทำไมต้องกังวลกับการหนี คุณมีความคิดเห็นอย่างไรเกี่ยวกับเรื่องนี้?
สิ่งนี้ใช้ได้ดีสำหรับฉันเมื่อพยายามทำสิ่งที่คล้ายกัน:
grep -F ABB.log a.tmp
$ cat venky
ABB.log
ABB.log.122
ABB.log.123
$ cat venky | grep "ABB.log" | grep -v "ABB.log\."
ABB.log
$
$ cat venky | grep "ABB.log.122" | grep -v "ABB.log.122\."
ABB.log.122
$
เหมาะสำหรับฉัน :
grep "\bsearch_word\b" text_file > output.txt
\b
ระบุ / กำหนดขอบเขต
ดูเหมือนว่าจะทำงานได้ค่อนข้างเร็ว
search_word
คั่นด้วยขอบเขตของคำ ตัวอย่างเช่นจะจับคู่บรรทัด "foo search_word bar"
ใช้กับ HPUX หากเนื้อหาของไฟล์มีช่องว่างระหว่างคำให้ใช้สิ่งนี้:
egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp
ฉันต้องการคุณสมบัตินี้ แต่ก็ต้องการให้แน่ใจว่าฉันไม่ได้ส่งคืนบรรทัดที่มีคำนำหน้าก่อน ABB.log:
grep "\WABB.log$" -w a.tmp
\W
มีความพึงพอใจซึ่งเป็นตัวละครใด ๆ xABBxlog
ที่ไม่ใช่ช่องว่างเพื่อให้