Saya ingin mencari file yang berisi dua string bersama, misalnya file berisi keduanya string1
dan string2
.
Saya ingin path lengkap file dalam output. Saya tidak ingin melihat peringatan "izin ditolak".
grep -l string2 `grep -l string1 /path/*`
yang sama dengan
grep -l string2 $(grep -l string1 /path/*)
Sunting: di sini mengapa grep string1 /path/* | grep string2
tidak melakukan apa yang saya pikir alwbtc inginkan.
$ cd /tmp
$ cat a
apples
oranges
bananas
$ cat b
apples
mangoes
lemons
$ cat c
mangoes
limes
pears
$ cd ~
$ grep apples /tmp/* | grep mangoes
$
Tidak ada yang ditemukan, tetapi file b berisi kedua string.
Inilah yang saya pikir alwbtc inginkan
$ grep -l apples $(grep -l mangoes /tmp/*)
/tmp/b
-l
opsi untuk mengembalikan nama file, bukan baris. Dia kemudian menggunakan tanda dolar atau tanda kutip belakang untuk melewati daftar itu sebagaiFILE
argumen ke grep kedua. Ini memungkinkan grep kedua untuk mencari keseluruhan setiap file yang ditemukan alih-alih setiap baris seperti pada solusi saya.-l
opsi untuk kedua perintah agar dianggap sama.Pipa satu
grep
ke yang lain:grep "string1" /path/to/files/* | grep "string2"
sumber
Inilah perintah ack yang setara dengan jawaban RedGrittyBrick :
Bekerja dengan cara yang sama (kecuali
ack
secara default mencari direktori saat ini secara rekursif). Konten dalam$()
pencarianstring1
tetapi-l
hanya menghasilkan nama file tempat string itu ditemukan. Mereka kemudian diteruskan sebagai argumen ke perintah luar, yang berartistring2
dicari dalam daftar file saja.sumber
atau kurang secara berlebihan:
Ini akan berfungsi jika string berada pada baris yang berbeda dari file yang sama dan juga akan menghindari kesalahan positif jika nama file mengandung salah satu string.
sumber
Untuk menguraikan solusi @ RedGrittyBrick yang memiliki kekurangan ketika menjalankan perintah tanpa pengawasan plus untuk menekan output kesalahan seperti yang dimaksudkan dan untuk menemukan file secara rekursif Anda dapat mempertimbangkan
grep -l 'STRING1' $(! grep -lrs 'STRING2' /absolute/path/to/search/dir && echo /dev/null)
-s
opsi akan menekan-r
opsi pesan kesalahan memungkinkan untuk mencari string di direktori bersarang sewenang-wenang!
dikombinasikan dengan&& echo /dev/null
jaminan bahwa perintah tidak akan menutup telepon. Jika tidak, jikainner grep
tidak menemukan file apa pun, maka tidak akan menghasilkan apa-apa sehinggaouter grep
menunggu tak terbatas untuk input untuk dicari. Solusi ini menghasilkan/dev/null
dalam kasus ini sehinggaouter grep
akan mencariSTRING1
di/dev/null
mana itu seharusnya tidak menemukan apa pun.sumber
Saya sedang mencari cara yang bisa dikembangkan untuk melakukan 2 atau lebih string dan datang dengan ini:
Grep pertama secara rekursif menemukan nama-nama file yang mengandung di
string1
dalamnyapath-to-files
.Hasilnya disalurkan ke
xargs
mana menjalankan satu atau lebih perintah grep pada file-file itustring2
.Hasilnya kemudian disalurkan ke
xargs
perintah lain untukstring3
- itu sama denganxargs
panggilan pertama , tetapi mencari string yang berbeda.Penggunaan
xargs
akan menghindari masalah di mana ada begitu banyak hasil sehingga baris perintah yang dihasilkan dari penggunaan back-ticks terlalu lama.Untuk menghindari peringatan, kami dapat mengalihkan
stderr
ke/dev/null
:Itu tidak diperlukan pada panggilan grep berikutnya karena
string1
telah ditemukan di dalam file sehingga izin diketahui baik.sumber