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 -q
beralih, tapi itu akan menekan output lengkap, yang saya tidak mau.
Bagaimana aku melakukan itu?
grep
jangan mencetak nama file dari file yang tidak cocok. Sebenarnya, sepertinyagrep
mempertimbangkan garis dengan konten yang0
cocok. Bisakah Anda memposting pola pencarian persis yang Anda gunakan?grep 'delete' * -R
, tapi saya pikir tidak-R
menyebabkan masalah. Dan ya, biasanya tidak mencetak yang tidak cocok, tetapi tidak yakin apa masalahnya di sini ...grep -- 'delete' *
(menambahkan--
) dan berhasil seperti yang diharapkan. Menghapus--
mengarah ke tampilan di atas.-ci
. Terima kasih telah menyelesaikan masalah. Anda dapat memposting skenario ini sebagai jawaban.Jawaban:
Itulah perilaku yang ditunjukkan oleh
grep -c
.Mungkin Anda memiliki file yang namanya dimulai dengan
-
dan mengandungc
karakter dan Anda menggunakan GNU grep tanpa mengaturPOSIXLY_CORRECT
variabel lingkungan.Menggunakan:
atau lebih baik:
--
menandai akhir opsi sehingga nama file tidak akan dianggap sebagai opsi (dengan grep POSIX, itu tidak akan terjadi karenadelete
argumen non-opsi akan menandai akhir opsi), tetapi itu tidak akan mengatasi masalah sebuah file bernama-
. Itugrep 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).sumber
Menambahkan
Tidak terlalu elegan tapi saya pikir akan melakukan pekerjaannya.
Menambahkan
-l
ke perintah Anda hanya akan memberi Anda kecocokan tetapi juga akan menekan jumlah pencocokan pencetakan untuk setiap file.sumber
-l
bekerja. bekerja-sekitar juga bagus. Terima kasihgrep -v ':0$'
demikian sehingga hanya mereka yang berada di ujung garis yang cocok (namun,grep -l
pendekatannya jauh lebih baik asalkan Anda tidak memerlukan jumlah garis)Menggunakan
grep -l
Anda 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
-c
yang digunakan untuk menghitung jumlah kecocokan dalam file.sunting: Dan seperti kata warlock
-I
untuk menekan kecocokan dalam file biner juga bisa menjadi ide bagus.sumber
Cara menghitung jumlah bukan nol:
grep -rIcH 'string' . | grep -v ':0$'
-r
Sub direktori perulangan.-I
Abaikan file biner (terima kasih @tongpu , warlock) .-c
Tunjukkan 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.)
sumber
Mirip dengan jawaban Laurentiu, Anda juga dapat menggunakan daftar
-l
sebagai input file untuk grep:grep -r "pattern" -c $(grep -rl "pattern")
Memungkinkan menjaga pewarnaan grep, tetapi melakukan hal yang sama di latar belakang
sumber