bash 在 awk cmd 中使用 var 不起作用

bash 在 awk cmd 中使用 var 不起作用

如果其中一个字段等于用户输入,我有以下脚本来过滤 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 字符串内显示的颜色在我的 shell 实例中都是紫色的,所以我假设“${arg1}”没有被正确解释

(我使用 var 作为用户输入的第一个参数,因为 awk 也使用美元符号语法,而且我不知道如何区分函数 args 和 awk 字段)

答案1

我认为这可能是您想要做的,但既没有示例输入,也没有预期输出,也不知道哪些值可以作为参数传递给函数,这是一个未经测试的猜测:

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

如何在 awk 脚本中使用 shell 变量有关在 awk 脚本中使用 shell 变量值的更多信息。

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
            }
        }
    '
}

但对于输入手册页的大小来说,不值得担心效率而不是简洁性。

相关内容