awk: dönüş statüsünü zorluyor mu?


18

Bu benim önceki sorumun takibi .

Bu kullanışlı snippit kullanarak / etc / passwd içindeki alanların sayısını onaylıyorum. Aşağıdaki örnekte, kullanıcıların 'fieldcount1' ve 'fieldcount2' yanlış sayıda alana sahip:

$ awk -F: ' NF!=7 {print}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
fieldcount2:blah::blah:1002:100:fieldcount2:/home/fieldcount2:/bin/bash:
$ echo $?
0

Fark edeceğiniz gibi, awk 0 döndürme durumu ile çıkacaktır. Bu bakımdan, burada herhangi bir sorun yoktur.

Bu awk deyimini bir kabuk betiğine dahil etmek istiyorum. Hata olan tüm satırları yazdırmak ve dönüş kodunu 1 (hata) olarak ayarlamak istiyorum.

Belirli bir çıkış durumunu zorlamaya çalışabilirim, ancak awk yalnızca tek bir satır yazdırır:

$ awk -F: ' NF!=7 {print ; exit 1}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
$ echo $?
1

Awk'yi '1' dönüş durumuyla çıkmaya ve eşleşen tüm satırları yazdırmaya zorlayabilir miyim?

Yanıtlar:


23

Durumu bir değişkente saklayın ve bir ENDblokta kullanın .

awk -F: 'NF != 7 {print; err = 1}
         END {exit err}' /etc/passwd

Çok iyi. Ancak ben bunu bir bash betiği içine dahil sorunlar yaşıyorum. Bu awk deyiminden ; echo $?sonra gibi bir şey ekleyerek bu awk deyiminin dönüş durumunu yakalamaya çalışıyorum . Ancak, komut dosyasını sonlandırdığı için echo $?asla çalıştırılmaz END {exit err}'. Çıkmadan geri dönüş durumunu ayarlamanın bir yolu var mı?
Stefan Lasiewski

6
@ StefanLasiewski awk'yi exit errsonlandırır, senaryoyu sonlandırmaz. Eğer var mı set -ebir ihtimal, o senaryodaki? Öyleyse, bir komut sıfır dışında bir durum döndürürse kabuğa çıkmasını söylediniz; durumu test etmek istiyorsanız, tuşunu kullanın if awk …; then echo ok; else echo fail; fi.
Gilles 'SO- kötü olmayı bırak

@Giles: Evet, bu komut dosyası set -eayarlandı. Bu gördüğüm garip davranışı açıklıyor. Bunu işaret ettiğiniz için teşekkürler.
Stefan Lasiewski

1
Çıktıyı bash &&operatörü ile kullanmayı planlıyorsanız , "0 doğru ama yanlış 1 kabukta" olduğunu unutmamak gerekir .
Skippy le Grand Gourou

8

Bir maç bulunamazsa 1'den çıkacağı Grep'e benzer bir şey arıyordum. İşte Awk ile eşdeğer:

#!/usr/bin/awk -f
BEGIN {
   b1 = 1
}
index($0, "sunday") > 0 {
   b1 = 0
   print
}
END {
   exit b1
}

0

Bu, OP kesin gereksinimlerini karşılamaz, ancak yalnızca dönüş kodunu önemsiyorsanız ve eşleşen satırları yazdırmanız gerekmiyorsa , benzer şekilde grep -q, ilk maçtan sonra çıkmak için @geekasaur yanıtını değiştirebilirsiniz, bu da büyük girdi için hata dosyada daha erken olsaydı dosyalar zaman kazandırır. Umarım /etc/passwdsizin için uygun değildir!

awk -F: 'NF != 7 {err = 1; exit;}
     END {exit err}' /etc/passwd

1
awk -F: 'NF != 7 {exit 1}'aynısını yapacağız.
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.