Dalam bash saya ingin mengembalikan nama file (dan path ke file) untuk setiap file tipe yang .php|.html|.jsberisi string case-insensitive"document.cookie" | "setcookie"
yang sepertinya tidak bekerja untuk saya (setidaknya tidak pada mac) .... hanya hang ... egrep -lir --include = * "repo" egrep: peringatan: pencarian rekursif stdin
Dean Hiller
13
Anda lupa menambahkan jalur untuk mencari. Jalannya adalah '.' dalam contoh di atas. Dalam kasus Anda, skrip sedang menunggu input untuk mencari di stdin. Coba: egrep -lir --include = * "repo" / (atau jalur lain)
LodeRunner
1
grep -E ... >egrep ...
Aman
Saya mendapat kesalahan grep: (error|fail): No such file or directorydi Ubuntu Desktop 16; ada petunjuk?
Nam G VU
Agar saya berfungsi, saya harus melewatkan * dengan \. jadi saya punya--include=\*.{php,html,js}
Mehrad Mahmoudian
53
Coba sesuatu seperti grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
yang -imembuatnya case insensitlve
yang .pada sarana akhir Anda ingin memulai dari direktori Anda saat ini, ini bisa diganti dengan direktori apapun.
yang -rberarti melakukan ini secara rekursif, sampai pohon direktori
yang -nmencetak nomor baris untuk pertandingan.
yang --includememungkinkan Anda menambahkan nama file, ekstensi. Wildcard diterima
Atau mungkin gunakan -lopsi (cukup cetak nama file yang cocok) alih-alih-n
glenn jackman
15
findmereka dan grepuntuk string:
Ini akan menemukan semua file dari 3 jenis Anda di / starting / path dan grep untuk ekspresi reguler '(document\.cookie|setcookie)'. Membagi menjadi 2 baris dengan garis miring terbalik hanya untuk keterbacaan ...
Seperti penggunaan universal find, tetapi menurut saya lebih baik menggunakan-exec grep -l 'sth' {} \;
NGix
Terima kasih @Michael Berkowski Cara ini tercepat lebih dari 5 atau 8 kali # egrep -ir --include=file.foo "(foo|bar)" /dirpada direktori weigth ~ 500Gb.
Qh0stM4N
9
Kedengarannya seperti pekerjaan yang sempurna untuk grepatau mungkin ack
+1 Menggunakan -exec grep...lebih baik daripada xargsmetode saya karena tidak akan tersedak spasi dalam nama file.
Michael Berkowski
@MichaelBerkowski: Anda dapat menggunakannya seperti ini untuk menangani spasi dalam nama file: find . -type f -print0 | xargs -0 -I {} grep "search_string" {}. Tentu saja, opsi lain dapat ditambahkan juga.
-regextype posix-extendedmemberitahu findregex seperti apa yang diharapkan
-regex "^.*\.(php|html|js)$"memberitahu findregex itu sendiri nama file harus cocok
-exec grep -EH '(document\.cookie|setcookie)' {} \;memberitahu finduntuk menjalankan perintah (dengan opsi dan argumennya) yang ditentukan antara -execopsi dan \;untuk setiap file yang ditemukannya, di mana {}mewakili tempat path file masuk dalam perintah ini.
sementara
Eopsi memberitahu grepuntuk menggunakan regex diperpanjang (untuk mendukung tanda kurung) dan ...
HOpsi memberitahu grepuntuk mencetak jalur file sebelum pertandingan.
Dan, mengingat ini, jika Anda hanya menginginkan jalur file, Anda dapat menggunakan:
|[pipa] kirim output dari findke perintah selanjutnya setelah ini (yaitu sed, lalu sort)
rOpsi memberitahu seduntuk menggunakan regex diperpanjang.
s/HI/BYE/memberitahu seduntuk mengganti setiap kemunculan Pertama (per baris) "HI" dengan "BYE" dan ...
s/(^.*):.*$/\1/memintanya untuk mengganti regex (^.*):.*$(artinya grup [barang terlampir oleh ()] termasuk semua [ .*= satu atau lebih karakter apa saja] dari awal baris [ ^] hingga 'yang pertama': 'diikuti oleh apa saja hingga' akhir dari baris [ $]) oleh grup pertama [ \1] dari regex yang diganti.
... JAUH dari cara yang paling elegan. Seperti yang saya katakan, maksud saya adalah untuk meningkatkan berbagai kemungkinan (dan juga untuk memberikan penjelasan yang lebih lengkap tentang beberapa alat yang dapat Anda gunakan).
Jawaban:
The
r
bendera berarti untuk mencari rekursif (mencari subdirektori). Thei
bendera berarti kasus tidak sensitif.Jika Anda hanya ingin nama file tambahkan bendera
l
(huruf kecilL
):sumber
grep -E ...
>egrep ...
grep: (error|fail): No such file or directory
di Ubuntu Desktop 16; ada petunjuk?--include=\*.{php,html,js}
Coba sesuatu seperti
grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
yang
-i
membuatnya case insensitlveyang
.
pada sarana akhir Anda ingin memulai dari direktori Anda saat ini, ini bisa diganti dengan direktori apapun.yang
-r
berarti melakukan ini secara rekursif, sampai pohon direktoriyang
-n
mencetak nomor baris untuk pertandingan.yang
--include
memungkinkan Anda menambahkan nama file, ekstensi. Wildcard diterimaUntuk info lebih lanjut, lihat: http://www.gnu.org/software/grep/
sumber
-l
opsi (cukup cetak nama file yang cocok) alih-alih-n
find
mereka dangrep
untuk string:Ini akan menemukan semua file dari 3 jenis Anda di / starting / path dan grep untuk ekspresi reguler
'(document\.cookie|setcookie)'
. Membagi menjadi 2 baris dengan garis miring terbalik hanya untuk keterbacaan ...sumber
-exec grep -l 'sth' {} \;
# egrep -ir --include=file.foo "(foo|bar)" /dir
pada direktori weigth ~ 500Gb.Kedengarannya seperti pekerjaan yang sempurna untuk
grep
atau mungkin ackAtau konstruksi yang luar biasa ini:
sumber
-exec grep...
lebih baik daripadaxargs
metode saya karena tidak akan tersedak spasi dalam nama file.find . -type f -print0 | xargs -0 -I {} grep "search_string" {}
. Tentu saja, opsi lain dapat ditambahkan juga.sumber
Hanya dengan memasukkan satu alternatif lagi, Anda juga dapat menggunakan ini:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;
Dimana:
-regextype posix-extended
memberitahufind
regex seperti apa yang diharapkan-regex "^.*\.(php|html|js)$"
memberitahufind
regex itu sendiri nama file harus cocok-exec grep -EH '(document\.cookie|setcookie)' {} \;
memberitahufind
untuk menjalankan perintah (dengan opsi dan argumennya) yang ditentukan antara-exec
opsi dan\;
untuk setiap file yang ditemukannya, di mana{}
mewakili tempat path file masuk dalam perintah ini.sementara
E
opsi memberitahugrep
untuk menggunakan regex diperpanjang (untuk mendukung tanda kurung) dan ...H
Opsi memberitahugrep
untuk mencetak jalur file sebelum pertandingan.Dan, mengingat ini, jika Anda hanya menginginkan jalur file, Anda dapat menggunakan:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u
Dimana
|
[pipa] kirim output darifind
ke perintah selanjutnya setelah ini (yaitused
, lalusort
)r
Opsi memberitahused
untuk menggunakan regex diperpanjang.s/HI/BYE/
memberitahused
untuk mengganti setiap kemunculan Pertama (per baris) "HI" dengan "BYE" dan ...s/(^.*):.*$/\1/
memintanya untuk mengganti regex(^.*):.*$
(artinya grup [barang terlampir oleh()
] termasuk semua [.*
= satu atau lebih karakter apa saja] dari awal baris [^
] hingga 'yang pertama': 'diikuti oleh apa saja hingga' akhir dari baris [$
]) oleh grup pertama [\1
] dari regex yang diganti.u
memberi tahu sortir untuk menghapus entri duplikat (ambilsort -u
sebagai opsional).... JAUH dari cara yang paling elegan. Seperti yang saya katakan, maksud saya adalah untuk meningkatkan berbagai kemungkinan (dan juga untuk memberikan penjelasan yang lebih lengkap tentang beberapa alat yang dapat Anda gunakan).
sumber