Komut satırı üzerinden awk vars'ı ayarlamanın 2 yolu var mı?


10

Program metninden sonraawk komut satırına ayarlayarak bir awk değişkeni atayan bir O'Reilly örneğini (1997) fark ettim . Çalışıyor, ancak bu sözdizimini man / info awk'de bulamıyorum . Sadece özledim mi? sınırlandırılmış mı? Kılavuzda gördüğüm tek sözdizimi seçenek.-v

awk '/home/{print foo, bar}' foo="cat" bar="dog" /proc/$$/cmdline

Çıktı: cat dog

Yanıtlar:


11

Aslında POSIX awk(POSIX 2008'e bağlantı, önceki sürümlerde de inanıyorum). Seçenekler bölümünde -vaçıklanırken , diğer yöntem Operands bölümündedir.

-vSonunda atamalar arasında dosya adlarıyla geçiş arasında bir fark vardır :

  • İle -v:

Başvuru, atama bağımsız değişkeninin atama işleneniyle aynı biçimde olmasını sağlayacaktır. Belirtilen değişken ataması, (varsa) BEGIN kalıplarıyla ilişkili eylemler de dahil olmak üzere awk programının yürütülmesinden önce gerçekleşir . Bu seçeneğin birden çok örneği belirtilebilir.

  • Dosya adlarıyla karıştırıldı:

[...] Bu tür her değişken atama , eğer varsa , aşağıdaki dosyanın işlenmesinden hemen önce gerçekleşecektir . Bu nedenle, ilk dosya bağımsız değişkeninden önceki bir atama BEGIN eylemlerinden sonra (varsa) yürütülürken, son dosya bağımsız değişkeninden sonraki bir atama END eylemlerinden önce (varsa) gerçekleşir. Dosya argümanı yoksa, standart girdi işlenmeden önce atamalar yürütülür.

Misal:

$ cat input 
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
    var=two input var=three input var=four
one
two
two
three
three
four

Vaov! Bu bazı ilginç kontrol noktaları ekliyor ... kullanışlı olması gerekiyor. Teşekkürler ...
Peter.O

1
İlk "Vay canına!" hala tutuyor, ancak Arcege'nin cevabına daha fazla bakarak biraz temperlendi ... Bunu "var = three" adlı gerçek bir dosyayla test ettim ... değişken bir görevawk olmasına öncelik verdi ... Bunun büyük bir sonucu var , yani. Gelen tüm bir dosya adı bu formu vardır durumlarda, bu yok sayılacak ve değişken kurulacaktır ... çatışmayı önlemenin tek yolu geçerli çalışma dizininin o dosyanın isimleri sağlayarak gibi görünüyor daima olmalıdır önek olarak göreceli yolu ile:./var=three
Peter.O

@ Peter.O, evet, -vsözdiziminin ortaya çıkmasının nedenleri arasında da . -vSözdizimini, ödev yapmanın tercih edilen yolu olarak düşünmelisiniz, ileriye doğru.
dubiousjim

@ Peter.O, bir dosya adı geçerli bir değişken ataması ise "gotcha" hakkında mükemmel bir nokta. Dosya adı içeren bir kabuk değişkeni kullanıyorsanız ve bunu bağımsız değişken olarak geçiriyorsanız awk, aşağıdaki yakalamayı kullanabilirsiniz:[ "$myfile" == "${myfile#/}" ] && myfile="./$myfile"
Wildcard

4

Bu, harici olarak değişkenleri ayarlamak için kullanılan eski bir stildir awk. Belirsizdi (ya bir dosya isminiz varsa foo=cat), bu yüzden sonraki sürümlerde bir -vseçenek eklendi . Muhtemelen geriye dönük uyumluluk için çalışmalıdır, ancak garanti edemezsiniz. Dediğim gibi, -vseçenek daha yeni, bu yüzden tüm sürümleri awkdesteklemeyebilir.


Dosya adı çakışması olasılığı hakkındaki yorumunuz iyi ... Bunu test ettim ve kesinlikle bir sorun. Mat'ın cevabına yaptığı bir yorumda biraz daha yazdım .. Thansk bu sorunu vurguladığı için (+1)
Peter.O

2
Aslında, [Mat s answer](http://unix.stackexchange.com/a/34258/9537), -v` ve argüman atamasında açıklandığı gibi, yürürlüğe girdikleri zaman farklıdırlar. Ayrıca -vPOSIX'te yer alıyor ve en eski awkuygulamalar dışında hepsinde mevcut olmalıdır . Kullanılması ./veya yapım emin dosya adı olmayan bir tanımlayıcı karakteri muhtemelen belirsizliği giderecek en güvenilir yoludur içeriyor.
jw013
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.