awk cmdでvarを使用するbashは機能しません

awk cmdでvarを使用するbashは機能しません

フィールドの 1 つがユーザー入力と同じ場合、ASCII テーブルをフィルタリングする次のスクリプトがあります。

ascii () {
        arg1=$1
        cmd=$(man ascii | awk '/000/,/077/ {print}' | sed '/^$/d')
        if [ #$ -eq 0 ]
                then
                        echo "${cmd}"
                else
                        newcmd=$(echo "${cmd}" | awk '{for(i=1;i<NF;i++) if ($i=="${arg1}") {print $0}}')
                        echo "${newcmd}"
        fi
}

言うまでもなく動作しませんが、次のエラーが発生します。

bash: [: missing `]'

そして、awk文字列内に表示される色は私のシェルインスタンスのすべてが紫であるため、「$ {arg1}」が正しく解釈されていないと仮定します。

(awkもドル記号構文を使用し、関数引数とawkフィールドを区別する方法がわからないため、ユーザー入力の最初の引数としてvarを使用しています。)

答え1

私はこれがあなたが望むものだと思いますが、サンプル入力や期待される出力がなく、どの値を関数に引数として渡すことができるかについてのアイデアがない場合、これはテストされていないと思います。

ascii() {
    man ascii |
    awk -v tgt="$1" '
        /000/ { f=1 }
        f && NF && ((tgt == "") || index(" "$0" "," "tgt" "))
        /077/ { f=0 }
    '
}

バラよりawkスクリプトでシェル変数を使用する方法awk スクリプトでシェル変数値を使用する方法に関する追加情報。

man ascii私のシステムでは「asciiなしで手動入力」が出力されるため、このコマンドがシステムからどのような形式で出力されるかはわかりませんが、awkスクリプトへの入力の興味のある部分(図表文字など)に空白ではなく空白が含まれていますその後、ターゲット文字列と比較するために、すべてのスペースをスペースに変換するのと同様の操作を実行します。

ascii() {
    man ascii |
    awk -v tgt="$1" '
        /000/ { f=1 }
        { rec=$0; gsub(/[[:space:]]+/," ",rec) }
        f && NF && ((tgt == "") || index(" "rec" "," "tgt" "))
        /077/ { f=0 }
    '
}

設定時に関連する作業だけを行うと、tgtより効率的に作成できます。たとえば、次のようになります。fNF

ascii() {
    man ascii |
    awk -v tgt="$1" '
        !NF { next }
        /000/ { f=1 }
        f {
            if ( tgt == "" ) {
                print
            }
            else {
                rec = $0
                gsub(/[[:space:]]+/," ",rec)
                if ( index(" "rec" "," "tgt" " ) {
                    print
                }
            }
            if ( /077/ ) {
                f=0
            }
        }
    '
}

ただし、入力マニュアルページのサイズを考慮すると、簡潔さよりも効率性を心配する価値はありません。

関連情報