Saya memiliki sejumlah baris yang diambil dari file setelah menjalankan perintah grep sebagai berikut:
var=`grep xyz abc.txt`
Katakanlah saya mendapat 10 baris yang terdiri dari xyz sebagai hasilnya.
Sekarang saya perlu memproses setiap baris yang saya dapatkan sebagai hasil dari perintah grep. Bagaimana saya melanjutkan ini?
grep -o
untuk hal semacam ini. The-o
bendera akan memberikan kembali hanya teks yang cocok, dengan satu pertandingan per baris dari output. (Ini tidak lengkap, jadiecho aaa |grep 'a*'
hanya memberi Anda "aaa" dan menghilangkan tiga pertandingan parsial "", "a", dan "aa")Jawaban:
Salah satu cara mudah adalah tidak menyimpan output dalam suatu variabel, tetapi langsung iterate dengan loop while / read.
Sesuatu seperti:
Ada variasi pada skema ini tergantung pada apa yang Anda cari.
Jika Anda perlu mengubah variabel di dalam loop (dan agar perubahan itu terlihat di luar itu), Anda dapat menggunakan substitusi proses seperti yang dinyatakan dalam jawaban fedorqui :
sumber
while read p || [[ -n $p ]]; do ...
(dipinjam dari stackoverflow.com/questions/1521462/… )Anda dapat melakukan
while read
loop berikut , yang akan diumpankan oleh hasil darigrep
perintah menggunakan proses yang disebut substitusi:Dengan cara ini, Anda tidak harus menyimpan hasilnya dalam sebuah variabel, tetapi langsung "menyuntikkan" hasilnya ke loop.
Perhatikan penggunaan
IFS=
danread -r
sesuai dengan rekomendasi di BashFAQ / 001: Bagaimana saya bisa membaca file (aliran data, variabel) baris demi baris (dan / atau bidang-demi-bidang)? :Mengenai penggantian proses, dijelaskan di halaman peretas bash :
sumber
for
versinya. Mencoba untuk melakukan loop"${$(grep xyz abc.txt)[@]}"
seperti pada stackoverflow.com/a/14588210/1983854 tetapi tidak bisa. Jadi saya hanya meninggalkan versi pertama.zsh
, di mana sarang semacam itu mungkin bekerja).while IFS= read -r result <&3
dandone 3< <(grep ...
Saya akan menyarankan menggunakan awk daripada grep + sesuatu yang lain di sini.
awk '$0~/xyz/{ //your code goes here}' abc.txt
sumber
//your code goes here
?Tanpa iterasi dengan opsi grep --line-buffered:
Contoh kehidupan nyata dengan perintah debug router Symfony PHP Framework ouput, untuk menangkap semua rute terkait "api":
sumber
tail -f some.log
, dalam kasus saya) ...Seringkali urutan pemrosesan tidak masalah. GNU Parallel dibuat untuk situasi ini:
Jika Anda memproses lebih seperti:
dan
myprogram
lambat maka Anda dapat menjalankan:sumber
Iterate atas hasil grep dengan loop while / read. Suka:
sumber
Bagi mereka yang mencari one-liner:
sumber