Mencari file yang berisi string tertentu menggunakan find (1) dan grep (1)

70

find . -type f -print -exec cat {} \; | grep some string

Perintah di atas tidak mencetak path file.

Saya menggunakan: Ubuntu, bash 4.

H.Rabiee
sumber
Mungkin itu tidak memenuhi hasil yang Anda harapkan karena filter grep. Bagaimana dengan ini:find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
artistoex
Apa tujuan yang ingin Anda capai? Pada output Anda mendapatkan string yang diambil dari file, Anda ingin path dari file-file itu?
mirkobrankovic
Ya saya ingin mencetak path file yang berisi string 'some string'. Saran @artistoex mencetak semua jalur file.
H.Rabiee
Anda mungkin hanya ingin menggunakan ackuntuk menelusuri semua file di bawah direktori saat ini, mungkin memfilter hanya pada tipe file tertentu.
Jaap Eldering

Jawaban:

87

Itu karena Anda memberi makan grepaliran teks yang kebetulan berisi nama file. Karena Anda tidak memberikan nama file sebagai argumen untuk di-grep, tidak dapat diharapkan untuk menyimpulkan dari file mana baris yang cocok berasal. Gunakan xargs:

find . -type f -print | xargs grep "some string"

Karena Anda memiliki GNU find / xargs, ini adalah cara yang lebih aman bagi xargs untuk membaca nama file:

find . -type f -print0 | xargs -0 grep "some string"

Jika Anda hanya ingin nama file yang memiliki baris yang cocok tanpa menunjukkan baris yang cocok:

find . -type f -print0 | xargs -0 grep -l "some string"
glenn jackman
sumber
Bagaimana saya menggabungkan perintah di atas dengan pencarian & ganti? Seperti di, grep lalu sed?
CMCDragonkai
1
the find | grep pipeline mengeluarkan nama file, jadi:sed '...' $(find ... | xargs grep -l ...)
glenn jackman
107

saya menggunakan

grep "some string" . -R

dan itu bekerja lebih cepat

ps

Kasus penggunaan yang lebih kompleks

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex 

Untuk membaca penjelasan param i

grep --help | grep -- -i
ArcherGodson
sumber
17
Dan -njika Anda ingin nomor baris. +1 untuk jawaban yang disederhanakan.
Chad Skeeters
@ChadSkeeters persis. Menggunakan menemukan tidak memberikan solusi tersebut.
ArcherGodson
1
Ini harus ditandai sebagai jawaban yang benar, jujur. Yang dipilih saat ini merinci sesuatu yang lain sepenuhnya.
12

Saya sering mencari kode sumber dalam struktur folder yang kompleks dan saya merasa berguna menggunakan:

cd /your/folder/
grep -rHino "your string"

Dengan parameter-parameter itu, tanpa menggunakan find , saya mendapatkan path file lengkap dan nomor baris yang berisi string yang ditentukan .

Ini juga mudah diingat karena BASH melalui pencarian Anda seperti badak :)

Saya akan menunjukkan bagaimana ini bekerja dengan contoh cepat.

Mari kita tampilkan konten file menggunakan cat:

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Dan mari kita cari secara rekursif semua file yang berisi string "iptables -P":

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

Seperti yang Anda lihat di output, kami memiliki nama file: hit baris: string yang dicari

Berikut deskripsi yang lebih rinci tentang parameter yang digunakan:

-r Untuk setiap operan direktori, baca dan proses semua file dalam direktori itu, secara rekursif. Ikuti tautan simbolis pada baris perintah, tetapi lewati symlink yang ditemui secara rekursif. Perhatikan bahwa jika tidak ada operan file yang diberikan, grep mencari direktori yang berfungsi. Ini sama dengan opsi '--directories = recurse'.

-i Cetak nama file untuk setiap pertandingan. Ini adalah default ketika ada lebih dari satu file untuk dicari.

-n Awali setiap baris output dengan nomor baris berbasis 1 dalam file inputnya. (-n ditentukan oleh POSIX.)

-H Cetak nama file untuk setiap pertandingan. Ini adalah default ketika ada lebih dari satu file untuk dicari.

-o Cetak hanya bagian yang cocok (tidak kosong) dari garis yang cocok, dengan masing-masing bagian tersebut pada jalur output terpisah. Baris output menggunakan pembatas yang sama dengan input, dan pembatas adalah byte nol jika -z (--null-data) juga digunakan (lihat Opsi Lain).

Pitto
sumber
2

Saya lebih suka

| menemukan file | make grep ont menemukan file | perlihatkan path lengkap file

find / -type f -exec grep 'some string' {} \; -exec echo {} \;

pengguna515185
sumber
0

Silver Searcher adalah utilitas yang sangat cepat dan praktis untuk mencari file dan konten.

Untuk mengatasi masalah Anda, perintah pencari perak akan terlihat seperti ini ...

ag 'some string' -l

-l Hanya cetak nama file yang mengandung yang cocok (jangan cetak baris yang cocok)

qoomon
sumber