Kuyruk kullanırken yeni satırları boş değerlere dönüştür


20

Çıktıyı tailyeni satırlar yerine null sonlandırılmış satırlar kullanmak için nasıl değiştirebilirim ?

Benim sorum şuna benzer: bash içinde boş sınırlı girişte `head` ve` tail` nasıl yapılır? , ama farklı bir şey yapmak istiyorum ki farklılık gösterir:

tail -f myFile.txt | xargs -i0 myCmd {} "arg1" "arg2"

Kullanmıyorum findve bu yüzden kullanamıyorum-print0

Tüm bunlar xargs'de oluşan hatayı önlemek için:

xargs: unmatched double quote;
    by default quotes are special to xargs unless you use the -0 option

Yanıtlar:


26

Son 10 satırı istiyorsanız:

tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2

Ancak GNU ile xargs, sınırlayıcıyı aşağıdakilerle yeni satıra ayarlayabilirsiniz:

tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2

( -0kısaltmasıdır -d '\0').

Taşınabilir olarak, her karakterden de kaçabilirsiniz:

tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2

Veya her satırı alıntılayın:

tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2

NUL ile sınırlandırılmış son 10 kaydını myFile.txtistiyorsanız (ancak bu bir metin dosyası olmazsa), çağrılmadan önce to değerini dönüştürmeniz gerekir \n; bu, dosyanın tam olarak okunması gerektiği anlamına gelir:\0tail

tr '\n\0' '\0\n' < myFile.txt |
  tail |
  tr '\n\0' '\0\n' |
  xargs -r0i myCmd {} arg1 arg2

Düzen (değişmesini beri tailhiç tail -fsorunuzu):

Yukarıdaki sonuncusu açıkça mantıklı değil tail -f.

xargs -d '\n'Biri çalışacaktır ancak diğer olanlar için, bir tamponlama sorunu olacak. İçinde:

tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2

trbir terminale gitmediğinde çıkışını tamponlar (burada bir boru). IE, yazmak için veri dolu bir tampon (8kiB gibi bir şey) birikinceye kadar hiçbir şey yazmaz. Hangi araçlar myCmdgruplar halinde çağrılacaktır.

Bir GNU veya FreeBSD sisteminde, arabelleğe alma davranışını trşu stdbufkomutla değiştirebilirsiniz:

tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
  xargs -r0i myCmd {} arg1 arg2

Aslında kuyrukta -f seçeneğini kullanmak istedim, satırları geldikçe sürekli olarak yazdırıyorlar. Bunun önemli olacağını düşünmedim, ama görünüşe göre öyle. -F seçeneği ile çözümünüz çalışmaz.
Lars

tail -f myFile.txt | xargs -r0i -d '\n' myCmd "{}" "||" "||"İşe görünüyor! Teşekkürler.
Lars

@Lars, üzgünüm, -iseçenek isteğe bağlı bir argüman alır, bu yüzden -i0işe yaramaz. tail -fSonuncusu dışında hepsi ile çalışmalı , ancak tamponlama nedeniyle xargs, girdisini almadan önce bir gecikme olacağını unutmayın tr. Bunu stdbuf -o0 tr '\n' '\0'yerine çalıştırarak değiştirebilirsiniz tr '\n' '\0'.
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.