awk 使用-v选项将参数传递给程序

示例

该选项-v后再加上变量= value形式的赋值可用于将参数传递给awk程序。下面的惩罚程序对此进行了说明,该程序的作用是写计数乘以句子“我不会在课堂上讲话”。在标准输出上。以下示例使用值100,该值在教师中非常流行:

awk -v count=100 'BEGIN {

  for(i = 1; i <= count; ++i) {

    print("我不会在课堂上讲话。")

  }

  exit

}'

可以重复使用-v标志来传递多个参数:

awk -v count=100 -v "sentence=我不会在课堂上讲话。" 'BEGIN {

  for(i = 1; i <= count; ++i) {

    print(sentence)

  }

  exit

}'

没有对数组或列表参数的内置支持,这些必须手动处理。通过列表参数一个经典的方法是使用一个分隔符来连接列表中,流行的选择是:,|或者,。然后,split函数允许将列表恢复为awk数组

awk -v 'serialised_list=a:b:c:d:e:f' 'BEGIN {

  list_sz = split(serialised_list, list, ":")

  for(i = 1; i <= list_sz; ++i) {

    printf("list: %d: %s\n", i, list[i])

  }

  exit

}'

这个awk程序的输出是

list: 1: a

list: 2: b

list: 3: c

list: 4: d

list: 5: e

list: 6: f

有时,将列表项恢复为awk数组的键更为方便,因为这样可以轻松进行成员身份验证。例如,下面的程序打印第一行不属于固定例外列表的每一行:

awk -v 'serialised_exception_list=apple:pear:cherry' 'BEGIN {

  _list_sz = split(serialised_exception_list, _list, ":")

  for(i = 1; i <= _list_sz; ++i) {

    exception[_list[i]]

  }

}

! ($1 in exception) { print }' <<EOF

apple Apples are yummy, I like them.

pineapple Do you like pineapple?

EOF

该程序的输出是

pineapple Do you like pineapple?

作为最后一个示例,我们显示如何将惩罚程序包装到shell脚本中,因为这说明了shell脚本如何将参数传递给辅助awk脚本:

#!/bin/sh

usage()

{

   cat <<EOF

Usage: punishment [-c COUNT][-s SENTENCE]

 Prepare your punishments for you

EOF

}

punishment_count='100'

punishment_sentence='我不会在课堂上讲话。'

while getopts "c:hs:" OPTION; do

  case "${OPTION}" in

    c) punishment_count="${OPTARG}";;

    s) punishment_sentence="${OPTARG}";;

    h) usage; exit 0;;

    *) usage; exit 64;;

  esac

done

awk -v "count=${punishment_count}" -v "sentence=${punishment_sentence}" 'BEGIN {

  for(i = 1; i <= count; ++i) {

    print(sentence)

  }

  exit

}'

           

以上是 awk 使用-v选项将参数传递给程序 的全部内容, 来源链接: utcz.com/z/315783.html

回到顶部