grep bagaimana cara menekan tampilan file yang tidak cocok?

11

Saya mencoba mencari file yang menggunakan kata tertentu grep. Ada banyak file di direktori (> 500)

Perintah saya jalankan

$ grep 'delete' *

Keluaran

validate_data_stage1:0
validate_data_stage2:0
validate_data_stage3:0
validate_data_stage4:0
validate_data_stage5:0
validate_input_stage1:0
validate_input_stage2:0
validate_input_stage3:0
validate_input_stage4:0
.... and hundred of such lines

Ini adalah file yang tidak mengandung kecocokan yang diberikan. Saya ingin menekan garis itu dari tampilan ke stdout. Saya tahu -qberalih, tapi itu akan menekan output lengkap, yang saya tidak mau.

Bagaimana aku melakukan itu?

mtk
sumber
2
Biasanya, grepjangan mencetak nama file dari file yang tidak cocok. Sebenarnya, sepertinya grepmempertimbangkan garis dengan konten yang 0cocok. Bisakah Anda memposting pola pencarian persis yang Anda gunakan?
Adrian Heine
Grd cmd lengkap yang saya gunakan adalah grep 'delete' * -R, tapi saya pikir tidak -Rmenyebabkan masalah. Dan ya, biasanya tidak mencetak yang tidak cocok, tetapi tidak yakin apa masalahnya di sini ...
mtk
@step @everyone .. Aneh ... Setelah melihat posting yang diedit di atas. Saya mencoba grep -- 'delete' *(menambahkan --) dan berhasil seperti yang diharapkan. Menghapus --mengarah ke tampilan di atas.
mtk
1
@Sthane Memang Anda benar. Saya mencari dir ... dan ada file dengan nama -ci. Terima kasih telah menyelesaikan masalah. Anda dapat memposting skenario ini sebagai jawaban.
mtk

Jawaban:

9

Itulah perilaku yang ditunjukkan oleh grep -c.

Mungkin Anda memiliki file yang namanya dimulai dengan -dan mengandung ckarakter dan Anda menggunakan GNU grep tanpa mengatur POSIXLY_CORRECTvariabel lingkungan.

Menggunakan:

grep -- delete *

atau lebih baik:

grep delete ./*

--menandai akhir opsi sehingga nama file tidak akan dianggap sebagai opsi (dengan grep POSIX, itu tidak akan terjadi karena deleteargumen non-opsi akan menandai akhir opsi), tetapi itu tidak akan mengatasi masalah sebuah file bernama -. Itu grep delete ./*lebih kuat tetapi memiliki kelemahan menghasilkan tambahan ./untuk file yang cocok (meskipun itu dapat dianggap bonus karena itu membantu mengidentifikasi nama file yang berisi karakter baris baru).

Stéphane Chazelas
sumber
12

Menambahkan

| grep -v ':0$'

Tidak terlalu elegan tapi saya pikir akan melakukan pekerjaannya.

Menambahkan -lke perintah Anda hanya akan memberi Anda kecocokan tetapi juga akan menekan jumlah pencocokan pencetakan untuk setiap file.

Laurentiu Roescu
sumber
1
-lbekerja. bekerja-sekitar juga bagus. Terima kasih
mtk
4
garis grep harus grep -v ':0$'demikian sehingga hanya mereka yang berada di ujung garis yang cocok (namun, grep -lpendekatannya jauh lebih baik asalkan Anda tidak memerlukan jumlah garis)
mreithub
9

Menggunakan grep -lAnda hanya akan mendapatkan file yang mengandung setidaknya satu kecocokan.

Apakah Anda memerlukan informasi tentang berapa banyak kecocokan yang ada dalam file? Karena Anda dapat melewati penggunaan -cyang digunakan untuk menghitung jumlah kecocokan dalam file.

sunting: Dan seperti kata warlock -Iuntuk menekan kecocokan dalam file biner juga bisa menjadi ide bagus.

tongpu
sumber
0

Cara menghitung jumlah bukan nol:

grep -rIcH 'string' . | grep -v ':0$'

  • -r Sub direktori perulangan.
  • -IAbaikan file biner (terima kasih @tongpu , warlock) .
  • -cTunjukkan hitungan pertandingan. Mengganggu, termasuk file 0-count.
  • -H Tampilkan nama file, meskipun hanya satu file.
  • 'string' tali Anda ada di sini.
  • . Mulai dari direktori saat ini.
  • | -v ':0$'Hapus file 0-hitung. (terima kasih @LaurentiuRoescu )

(Saya menyadari OP tidak sengaja menghitung -c, tapi google (jumlah grep bukan nol) mendarat di sini.)

Bob Stein
sumber
0

Mirip dengan jawaban Laurentiu, Anda juga dapat menggunakan daftar -lsebagai input file untuk grep:
grep -r "pattern" -c $(grep -rl "pattern")
Memungkinkan menjaga pewarnaan grep, tetapi melakukan hal yang sama di latar belakang

adriel
sumber
perhatikan bahwa nama file & direktori yang berisi spasi atau wildcard akan keliru dipisah dan dicocokkan sebagai hasilnya.
Jeff Schaller