Yanıtlar:
Kolay yollardan biri, çıktıyı bir değişkende saklamak değil, bir while / read döngüsü ile doğrudan üzerinden yinelemektir.
Gibi bir şey:
grep xyz abc.txt | while read -r line ; do
echo "Processing $line"
# your code goes here
done
Bu şemada tam olarak neyin peşinde olduğunuza bağlı olarak varyasyonlar var.
Döngü içindeki değişkenleri değiştirmeniz gerekiyorsa (ve bu değişikliğin dışında görünür olması gerekiyorsa), fedorqui'nin cevabında belirtildiği gibi işlem ikamesini kullanabilirsiniz :
while read -r line ; do
echo "Processing $line"
# your code goes here
done < <(grep xyz abc.txt)
while read p || [[ -n $p ]]; do ...
( stackoverflow.com/questions/1521462/… ' dan ödünç alındı )
İşlem ikamesi denilen komut kullanılarak komutun while read
sonucuyla beslenecek aşağıdaki döngüyü yapabilirsiniz grep
:
while IFS= read -r result
do
#whatever with value $result
done < <(grep "xyz" abc.txt)
Bu şekilde, sonucu bir değişkende saklamak zorunda kalmazsınız, ancak çıktısını doğrudan döngüye "enjekte eder".
Kullanımını Not IFS=
ve read -r
BashFAQ / 001 önerilere göre: Bir dosyayı (veri akışı, değişken) çizgi-by-line (ve / veya bu alanda bazında alanda) okuyabilir nasıl? :
Okuma için -r seçeneği ters eğik çizgi yorumlamasını önler (genellikle ters eğik çizgi yeni satır çifti olarak kullanılır, birden çok satıra devam etmek veya sınırlayıcılardan kaçmak için). Bu seçenek kullanılmazsa, girişteki çıkışsız ters eğik çizgiler atılır. Hemen her zaman okuma ile -r seçeneğini kullanmalısınız.
Yukarıdaki senaryoda IFS = ön ve arka boşlukların kırpılmasını önler. Bu efekti istiyorsanız kaldırın.
İşlem ikamesi ile ilgili olarak, bash hackerlar sayfasında açıklanmaktadır :
İşlem ikamesi, bir işlemin giriş veya çıkışının (bazı komut dizileri) geçici bir dosya olarak göründüğü bir yönlendirme şeklidir.
for
sürümü gördüm . Stackoverflow.com/a/14588210/1983854'teki"${$(grep xyz abc.txt)[@]}"
gibi bir döngü yapmaya çalıştım, ancak yapamadı. Bu yüzden sadece ilk sürümü terk ediyorum.
zsh
bu tür yuvalamanın muhtemelen işe yaradığı yerlerde kullanmıyorsanız ).
while IFS= read -r result <&3
vedone 3< <(grep ...
Burada grep + yerine başka bir şey yerine awk kullanmanızı öneririm.
awk '$0~/xyz/{ //your code goes here}' abc.txt
//your code goes here
?
--Line arabelleğe alınmış grep seçeneği ile herhangi bir yineleme olmadan:
your_command | grep --line-buffered "your search"
Symfony PHP Framework yönlendirici hata ayıklama komutu çıkışıyla gerçek hayattan örnek "api" ile ilgili tüm rotaları grep:
php bin/console d:r | grep --line-buffered "api"
tail -f some.log
Genellikle işlemin sırası önemli değildir. GNU Paralel bu durum için yapılmıştır:
grep xyz abc.txt | parallel echo do stuff to {}
İşleminiz daha çok şöyle ise:
grep xyz abc.txt | myprogram_reading_from_stdin
ve myprogram
yavaşsa o zaman çalıştırabilirsiniz:
grep xyz abc.txt | parallel --pipe myprogram_reading_from_stdin
grep -o
bu tür şeylerin gücünden bahsetmiyor .-o
Bayrak geri verecek tek çıktı satır başına bir eşleme ile, kibrit metni. (Kapsamlı değildir, bu yüzdenecho aaa |grep 'a*'
size sadece "aaa" verir ve "", "a" ve "aa" adlı üç kısmi eşleşmeyi atlar)