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?


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).


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.


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.


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.)


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


perhatikan bahwa nama file & direktori yang berisi spasi atau wildcard akan keliru dipisah dan dicocokkan sebagai hasilnya.
— Jeff Schaller
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.