プログラムでawkフレーバーを検出する方法(gawkとnawkなど)


8

私は基本的にbashシェルスクリプトのコレクションであるコマンドラインアプリケーションを使用しています。アプリケーションは、BSD / OSXおよびLinuxで実行するように作成されました。スクリプトの1つはawkに依存しています。これには2つのawkコマンドが含まれています。1つはnawk(標準のBSD awk実装)用に記述され、もう1つはgawk(GNU awk実装)用に記述されています。

問題の2つのawkコマンドは、異なる環境との互換性がありません。特に、gawkで実行するとnawkコマンドが失敗します。スクリプトは、uname -sホスト環境を判別するためにカーネル名(つまり)をチェックし、適切なawkコマンドを実行します。ただし、GNUコアユーティリティがインストールされたMac OS Xで作業することを好むため、スクリプトは正しく実行されません。

このバグを修正する最善の方法を考える過程で、できれば比較的堅牢で移植性のある方法で、一般的なコマンドラインユーティリティの異なるフレーバーをプログラムで区別する方法を知っておくとよいと思いました。

nawkがバージョン情報を出力するための「-V」フラグを受け入れないことに気付いたので、次のようなものが機能するはずだと考えました。

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

別のバリエーションは次のとおりです。

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

これは私の2つのテスト環境(OS XとCentOS)で動作するようです。ここに私の質問があります:

  • これは最善の方法ですか?
  • これを拡張してawkの他のバリエーション(例:mawk、jawkなど)を処理する方法はありますか?
  • awkの他のバージョンについても心配する価値がありますか?

また、私はawkについてほとんど知らないことも述べておきます。


awkコマンドがそれほど複雑でない場合、または複雑である場合でも、perlまたは他の均一なものに移植することを検討してください。
ワイルドカード

awk -Wvホスト環境の代わりにawkバージョンを見てみましょう
Costas

1
私のawkは非常に弱いですが、それは非常に単純だと思います。私は実際にそれを純粋なbashで書き直しました。しかし、これは、元の問題を実際に解決するよりも、好奇心を満たすことに関心がある状況の1つです。
igal

@Costasそのようなことが実際に起こりましたが、それがどれほど脆弱かはわかりませんでした。私はawkについてほとんど知りません。現在のソリューションを投稿に追加しました。
igal

1
1つの代替策は、awk使用されているのバージョンを無視して、代わりにPOSIX仕様にコード化することです。
chepner、2015年

回答:


7
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

または、test is awkはシンボリックリンクです。

awk=$( command -v awk )
[[ -L $awk ]] && readlink $awk # make some decision about the result of that

これは問題ありません...しかし、古いawk、nawk、および新しいBWKバージョンにはいくつかのバリエーションがあります(区別が難しい)。それらのために、サンプルスクリプト調整れるかもしれません
Thomas Dickey、

3

使用してみてくださいwhichコマンドを、その終了コードを使用します。

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

次に、変数をコマンドとして使用するようにスクリプトをフォーマットします

$command '{print $1}` 

と読まれます

nawk '{print $1}`

もしwhich発見がnawkの。それ以外の場合はgawk


1
以来、commandあなたは変数に別の名前を使用する場合があります組み込みのbashで、あなたも多くのシェルのために、より良い代替手段がある理由について非常に詳細な回答を見たいかもしれないwhichunix.stackexchange.com/a/85250/109842を
Eric Renouf、2015年

1

GNU Awkのは、多くの場合のようにインストールされているgawkと、awkGNUがデフォルトであるシステム上で、それへのシンボリックリンクとして。BSDとOS Xシステムはすでに独自のものを持っているので、これは当てはまると思いawkます。

if gawk '{ exit; }' < /dev/null 2> /dev/null
then
    echo "gawk available"
else
    echo "gawk not available"
fi

ご協力ありがとうございます。これは良い考えであり、OS Xの私にとってもそうです。しかし、いわば本質的な解決策を望んでいました。
igal

0

汚いハック

if nawk 'BEGIN { nawk-only-function() ;}' 
then 
   nawk -f nfile.awk ...
else 
   gawk -f gfile.awk ...
fi
  • nawk-only-function() のみに存在する場所nawk

-2

おそらくautoconfのAC_PROG_AWK m4マクロを悪用して、適切な順序で1つを選択してみます。それはおそらくやり過ぎです


あなたはでし編集あなたは、このシナリオのためにそのマクロを使用したい方にもう少し詳細を提供するには?
マイケルホーマー

実際にどれが見つかったかはわかりませんが、awk実装を探して、その名前に基づいて選択します。
Thomas Dickey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.