Jika ada yang menjalankan perintah berikut
cat * | grep DATABASE
shell akan memuntahkan semua baris dalam file * yang berisi kata DATABASE
di dalamnya. Apakah ada cara untuk juga memuntahkan file apa setiap baris terpisah?
Saya mencoba menggunakan -H
opsi untuk grep yang menurut man
mengatakan print the filename for each match
tetapi di shell saya hanya mengatakan
(standard input):$DATABASE_FUNCTION = dothis();
Jawaban:
Jangan gunakan kucing untuk itu. Alih-alih menggunakan
grep DATABASE *
ataugrep -n DATABASE *
(jika Anda ingin mengetahui nomor baris serta nama file) secara langsung.Lihat penggunaan kucing yang tidak berguna .
Untuk lebih memperjelas:
cat *
sebenarnya menyatukan semua file ketika memberi mereka untuk menerobos melalui pipa, jadi grep tidak memiliki cara untuk mengetahui konten mana yang termasuk file yang mana, dan memang tidak bisa benar-benar tahu apakah itu memindai file atau Anda hanya mengetik dengan cepat. Itu semua satu aliran input standar besar setelah Anda menggunakan pipa.Terakhir,
-H
redundan hampir pasti karena grep mencetak nama file secara default ketika punya lebih dari satu file untuk dicari. Ini bisa berguna jika Anda ingin mem-parsing output, meskipun, karena ada beberapa kemungkinan*
glob akan meluas ke satu file dan grep akan dalam hal itu menghilangkan nama file.sumber
Gunakan
grep -H DATABASE *
(catatan: jika ada lebih dari satu file di direktori,-H
ini opsional).Masalah yang Anda alami adalah bahwa dengan perintah Anda,
cat *
menggabungkan semua file bersama menjadi satu kekacauan besar, dan kemudian|
mengirimkannya ke input standargrep DATABASE
. Pada saat grep melihat data, info tentang dari mana asalnya telah hilang. Solusinya adalah membuat grep melakukan pekerjaan mencari melalui file individual, jadi ketika menemukan kecocokan ia tahu dari mana file itu berasal.sumber