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
daftar pertanyaan
sumber

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
Jesse_b
sumber
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.

simlev
sumber
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