Awk tidak akan mencari melalui file di sub direktori?


2

Saya mencoba menggunakan awk untuk mencari melalui beberapa file untuk string tertentu, tetapi mengembalikan

'Example' is a directory: skipped.

Bagaimana saya bisa menggunakan awk untuk mencari melalui semua subdirektori dan file?

Contoh penggunaan,

awk -F: '$3 ~ /example/' * > C:/out.txt

Jawaban:


3

Ini adalah masalah dengan shell globbing dan bukan awk. Untuk melakukan glob secara rekursif Anda harus mengaktifkan globstaropsi bash .

shopt -s globstar

globstar

Jika diatur, pola ** yang digunakan dalam konteks ekspansi pathname akan cocok dengan semua file dan nol atau lebih direktori dan subdirektori. Jika polanya diikuti oleh a, hanya direktori dan subdirektori yang cocok.

Jadi, Anda akan dapat:

awk -F: '$3 ~ /example/' ** > C:/out.txt

Catatan Anda masih akan menerima kesalahan tentang direktori itu sendiri dilewati tetapi juga akan berulang ke dalamnya. Anda dapat menyembunyikan kesalahan dengan mengarahkan stderr ke / dev / null

awk -F: '$3 ~ /example/' ** > C:/out.txt 2>/dev/null

2

Saya sarankan Anda menggunakan finddalam kombinasi dengan awk:

find -type f -exec awk -F: '$3 ~ /example/' {} > c:/out.txt \;

Catatan: find bukan pengganti sederhana *, seperti yang ditunjukkan dengan benar dalam komentar di bawah. Anda mungkin ingin mengatur findparameter Anda untuk mengembalikan set file yang Anda cari.

Catatan: hanya satu >yang masih diperlukan (berlawanan dengan >>) karena itu adalah findoutput yang dialihkan.

Catatan: jika, sepertinya, Anda gunakan cmder, Anda harus berhati-hati untuk memanggil GNU find dan bukan Windows find.exe. Lihat di sini untuk cara-cara mengatasi ambiguitas ini.


1
Perhatikan bahwa pengalihan bukan bagian dari perintah yang diberikan -execdan karena itu dapat dipindahkan ke setelah \;. Efeknya akan tetap sama. Ada juga perbedaan kecil dalam findperintah yang akan menemukan file tersembunyi, sementara shell glob secara default tidak.
Kusalananda
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.