Awk xushbo'yligini dasturiy jihatdan aniqlash (masalan, gawk vs nawk)

Men aslida bash shell skriptlari to'plami bo'lgan buyruq-layn ilovasidan foydalanmoqdaman. Dastur BSD/OSX va Linuxda ishlash uchun yozilgan. Skriptlardan biri awkka asoslangan. U awk komutlarını o'z ichiga oladi: biri nawk uchun yozilgan (standart UX awk dastur) va bir gawk uchun yozilgan (GNU awk dasturi).

Ushbu ikki awk buyruqlar turli xil muhitlar bilan o'zaro mos emas; xususan, gawk bilan ishlaganda nawk buyrug'i bajarilmaydi. Buyruq fayli host muhitini aniqlash uchun yadro nomini (ya'ni, uname -s ) tekshiradi va muvofiq awk buyrug'ini boshqaradi. Biroq, GNU yadro yordam dasturlari o'rnatilgan Mac OS X ustida ishlashni afzal ko'raman, shuning uchun buyruq fayli to'g'ri ishlamasa.

Ushbu xatolarni tuzatishning eng yaxshi yo'li haqida fikr yuritish jarayonida menda umumiy komanda komandasi yordamchi dasturlarining turli xil lazzatlari o'rtasida qanday qilib dasturiy jihatdan farqlashni bilish yaxshi bo'lardi, bu esa, avvalo, nisbatan ishonchli va portativ tarzda amalga oshiriladi.

Noyk versiya ma'lumotlarini chop etish uchun "-V" bayrog'ini qabul qilmaganini payqadim, shuning uchun quyidagi o'xshash narsalar ishlashi kerakligini angladim:

awk -V &>/dev/null && echo gawk || echo nawk

Boshqa bir o'zgarish ham bo'lishi mumkin:

awk -Wversion &>/dev/null && echo gawk || echo nawk

Bu mening ikkita test muhitimda (OS X va CentOS) ishlaydi. Mana mening savollarim:

  • Bu eng yaxshi usulmi?
  • Buni awk boshqa turlarini (masalan, mawk, jawk va boshqalar) boshqarish uchun kengaytirish uchun bir usul bormi?
  • Boshqa awk versiyalari haqida tashvishlanishga arziydimi?

Bundan tashqari, men awk haqida juda kam narsa bilaman.

8
Men ham awk haqida juda oz narsa bilaman va menda kitob bor! Solaris'dan Linuxga yoki HP-UXga ko'chirganimda "silliq" awk kod ishlamagan ishni bir necha marta urganman. Kitobi "Ko'p awk versiyasi mavjud ..." deb boshlanadi, shuning uchun ssenariyangizni turli xil Unix tatlarida ishlayotganini bilsangiz, bu xato javob yoki Perl javob to'g'ri bo'lishi mumkin.
qo'shib qo'ydi muallif Mark Stewart, manba
Agar awk buyrug'i juda murakkab bo'lmasa yoki hatto bo'lsa ham Perl yoki boshqa bir narsaga o'xshash boshqa narsalarni portlashni ko'rib chiqishingiz mumkin.
qo'shib qo'ydi muallif Wildcard, manba
Buning odatiy usullaridan biri - operatsion tizimni "uname" yordamida sinash va undan keyin OSga asoslangan kutilgan buyruqni tanlashdir.
qo'shib qo'ydi muallif TiFFolk, manba
Buning bir varianti awk ning qanday versiyasini ishlatishni e'tiborsiz qoldirib, POSIX spesifikatsiyasi .
qo'shib qo'ydi muallif Luke Smith, manba
Mening awk juda zaif, lekin menimcha, bu juda oddiy. Aslida, men uni toza bashda qayta yozganman. Ammo, bu asl muammolarni aslida hal qilishdan ko'ra mening qiziqishimni qondirishdan ko'proq manfaatdor bo'lgan vaziyatlardan biridir.
qo'shib qo'ydi muallif Mark Owen, manba
@Costas Aslida menga o'xshash narsa paydo bo'ldi, lekin men qanchalik nozik bo'lishi mumkinligiga ishonchim komil emas edi; Awk haqida juda oz narsa bilaman. Mavjud echimni lavozimga qo'shdim.
qo'shib qo'ydi muallif Mark Owen, manba
@DouglasHeld Asl postda aytib o'tganimizdek, operatsion tizimni tekshirish (uname bilan) UX tizimida GNU yordam dasturlari o'rnatilganligi sababli hozirda ishlamayotgan usuldir.
qo'shib qo'ydi muallif Mark Owen, manba
Awk-versiyasini uyali muhit o'rniga ko'ra awk -Wv ga ko'ra ko'ring
qo'shib qo'ydi muallif Russell, manba

5 javoblar

if awk --version 2>&1 | grep -q "GNU Awk"
then
    awk 'BEGIN {print "I am GNU Awk"}'

elif awk -Wv 2>&1 | grep -q "mawk"
then
    awk 'BEGIN {print "I am mawk"}'

else
    awk 'BEGIN {print "I might be nawk, might not be"}'
fi

Shu bilan bir qatorda, test awk ramziy bog'lanishdir:

awk=$( command -v awk )
[[ -L $awk ]] && readlink $awk # make some decision about the result of that
7
qo'shib qo'ydi
Bu yaxshi ... lekin oldingi-awk, nawk va yangi BWK versiyalarida bir nechta farqlar mavjud. Buning uchun misol buyruq fayli moslashtirilishi mumkin.
qo'shib qo'ydi muallif Thomas Dickey, manba

qaysi buyrug'ini ishlatib ko'ring va uning chiqish kodidan foydalaning.

which nawk
if [[ $? == 0 ]]; then
    command="nawk"
else
    command="gawk"
fi

keyin siz buyruqlar buyrug'i sifatida o'zgarmaydiganni ishlatish uchun buyurtmangizni formatlashtiring

$command '{print $1}` 

kabi o'qiladi

nawk '{print $1}`

if which finds nawk. Otherwise it would use gawk

3
qo'shib qo'ydi
chunki buyrug'i siz o'zgarmaydiganingiz uchun boshqa nomni ishlatishni xohlashingiz mumkin bo'lgan bash emblemidir va siz nima uchun juda ko'p chig'anoqlar uchun ga yaxshi muqobillar borligi haqida ajoyib javobni ko'rishni xohlashingiz mumkin. -da unix.stackexchange.com/a/85250/109842
qo'shib qo'ydi muallif Eric Renouf, manba
Bu qiziqarli o'qish edi. Rahmat. :)
qo'shib qo'ydi muallif HongKilDong, manba

Men autoconf da AC_PROG_AWK m4 makrosini birini tanlab, ularni to'g'ri tartibda buyurtma qilishni so'rayman. Ehtimol, bu juda ham ko'p

2
qo'shib qo'ydi
Qaysi biri topilganligini aniq aytolmaydi, lekin shunchaki awk dasturlarini izlaydi va uning nomiga asoslanib birini tanlaydi.
qo'shib qo'ydi muallif Thomas Dickey, manba
Ushbu senariy uchun ushbu so'lni qanday ishlatishni bilib olish uchun tartibga solish mumkinmi?
qo'shib qo'ydi muallif Michael Homer, manba

GNU Awk odatda gawk sifatida o'rnatiladi va awk bilan GNU ning sukut bo'yicha tizimlarida unga ramziy aloqa sifatida kiritiladi. Buni BSD va OS X tizimlarida ko'rish mumkin, chunki ular allaqachon o'zlarining awk kodiga ega.

if gawk '{ exit; }' < /dev/null 2> /dev/null
then
    echo "gawk available"
else
    echo "gawk not available"
fi
1
qo'shib qo'ydi
Kirishingiz uchun tashakkur. Bu yaxshi fikr va siz X menda bu X men uchun to'g'ri ekanligining to'g'riligini bilasiz. Lekin men o'zimning ichki echimni umid qilgandim.
qo'shib qo'ydi muallif Mark Owen, manba

Harom hack

if nawk 'BEGIN { nawk-only-function() ;}' 
then 
   nawk -f nfile.awk ...
else 
   gawk -f gfile.awk ...
fi
    nawk-only-function() faqat nawk
0
qo'shib qo'ydi