Saya punya ini:
$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123
Saya ingin menemukan yang sama persis dengan ABB.log.
Tapi saat aku melakukannya
$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123
itu menunjukkan semuanya.
Bisakah saya mendapatkan apa yang saya inginkan menggunakan grep?
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
Dari halaman manual grep:
sumber
-F
? Apakah Anda di Solaris? Jika demikian gunakan/usr/xpg4/bin/grep
grep
di dalam skrip bash dan opsi ini lebih baik daripada menggunakan ekspresi reguler seperti yang disarankan dalam jawaban yang diterima. Karena saya memiliki beberapa karakter khusus di dalam variabel yang saya cari (suka.
) dan saya tidak perlu menghindarinya saat menggunakan perintah.Inilah yang saya lakukan, meskipun menggunakan jangkar adalah cara terbaik:
sumber
ABB.log
, yang bukan kasus umum, yaitu akan gagal sebagian besar waktu.Sebagian besar saran akan gagal jika hanya ada satu spasi di depan atau di belakang, yang penting jika file sedang diedit secara manual. Ini akan membuatnya kurang rentan dalam kasus itu:
Loop sementara-baca sederhana di shell akan melakukan ini secara implisit:
sumber
begitu pula dengan awk
sumber
Saya bermaksud menambahkan beberapa penjelasan tambahan mengenai upaya OP dan jawaban lainnya juga.
Anda juga dapat menggunakan solusi John Kugelmans seperti ini:
mengutip string dan meng-escape titik (
.
) membuatnya tidak lagi membutuhkan-F
flag.Anda perlu meng-escape
.
(titik) (karena cocok dengan karakter apa pun (tidak hanya.
) jika tidak di-escape) atau gunakan-F
flag dengan grep.-F
flag menjadikannya string tetap (bukan regex).Jika Anda tidak mengutip string, Anda mungkin perlu garis miring terbalik ganda untuk mengosongkan titik (
.
):Uji:
catatan:
-x
kekuatan untuk mencocokkan seluruh garis..
tanpa-F
flag salah.-x
pengalihan dengan membungkus string pola Anda dengan^
dan$
. Dalam hal ini, pastikan Anda tidak menggunakan-F
, alih-alih escape.
, karena-F
akan mencegah interpretasi regex dari^
dan$
.EDIT: (Menambahkan penjelasan tambahan tentang @hakre):
Jika Anda ingin mencocokkan string yang dimulai dengan
-
, maka Anda harus menggunakan--
grep. Apapun yang mengikuti--
akan diambil sebagai masukan (bukan pilihan).Contoh:
sumber
-F
tidak diperlukan jika.
lolos dengan benar.-F
tersedia saat Anda menulis ini? Jika tidak, sistem mana yang Anda gunakan? Sejauh ini saya tidak dapat menemukan informasi itu dalam jawaban Anda, yang bahkan sekarang adalah kasus ketika saya membacanya lagi. Jadi sangat yakin, saya membaca jawaban Anda sepenuhnya setidaknya dua kali. ;)-F
tersedia. (Saya memang mengatakan: "atau gunakan-F
bendera dengangrep
")-F
jawabannya, mengapa repot-repot melarikan diri? Apa pendapatmu tentang itu?Ini bekerja dengan baik untuk saya ketika mencoba melakukan sesuatu yang serupa:
sumber
sumber
Bekerja untuk saya :
\b
menunjukkan / menetapkan batas.Sepertinya bekerja cukup cepat
sumber
search_word
dipisahkan oleh batas kata. Misalnya, ini akan cocok dengan baris, "foo search_word bar".Ini dengan HPUX, jika konten file memiliki spasi antar kata, gunakan ini:
egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp
sumber
Saya lebih suka:
Bersulang
sumber
ABBxlog
Saya membutuhkan fitur ini, tetapi juga ingin memastikan bahwa saya tidak mengembalikan baris dengan awalan sebelum ABB.log:
sumber
\W
terpenuhi, yaitu karakter non spasi kosong, jadixABBxlog
.