【问题标题】:How to pass shell variable to awk command inside shell script如何将shell变量传递给shell脚本中的awk命令
【发布时间】:2017-09-28 16:38:26
【问题描述】:

我只想将一个存储文件名的 shell 变量传递给 awk 命令。当我在网上搜索这个问题时,我看到了许多不同的选项,但没有一个对我有用。我尝试了以下方法:

#!/bin/bash
for i in "$@"
do
case $i in
    -p=*|--producedfile=*)
    PFILE="${i#*=}"
    shift # past argument=value
    *)
          # unknown option
    ;;
esac
done
echo "PRODUCEDFILE  = ${PFILE}"
awk  -v FILE=${PFILE} '{print FILE $0}' #DIDNT WORK
awk   '{print FILE $0}' ${PFILE} # DIDNT WORK
awk  -v FILE=${PFILE} '{print $0}' FILE #DIDNT WORK

【问题讨论】:

  • 不确定我明白了,$PFILE 是文件的名称,Awk 应该处理(或)只是传递给正文?
  • @Inian $PFILE 是 Awk 应该按照您所说的那样处理的文件的名称。假设这是在名为 mybash.sh 的 bash 脚本中。然后我调用以下命令: bash mybash.sh -p=inputfile.txt
  • 那么为什么awk '{print FILE $0}' ${PFILE} 不起作用?请记住 FILE 变量在此处未定义。我确信这会一次打印一行inputfile.txt 的内容
  • 如果您使用参数-p=inputfile.txt 调用它,那么就不需要转换。如果你用-p inputfile.txt 调用它,你会shift,在这种情况下${i#*=} 不起作用。删除shift

标签: linux bash shell awk


【解决方案1】:

要将 shell 变量传递给 awk,您正确使用了 -v 选项。

但是,shift 是不必要的(您正在使用 for 迭代选项),缺少 ;;(您必须终止每个案例分支),以及 @987654326 的文件名@处理。已修复,您的脚本如下所示:

#!/bin/bash
for i in "$@"; do
    case $i in
        -p=*|--producedfile=*)
            PFILE="${i#*=}"
            ;;
        *)
             # unknown option
            ;;
    esac
done

echo "PRODUCEDFILE = ${PFILE}"
awk  -v FILE="${PFILE}" '{print FILE, $0}' "${PFILE}"

但是请注意,awk 已经在 FILENAME 变量中提供了当前处理文件的名称。所以,你也可以把最后一行写成:

awk '{print FILENAME, $0}' "${PFILE}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2011-02-03
    • 2015-01-21
    • 2012-03-04
    • 2014-01-05
    • 2018-04-02
    • 2020-03-28
    相关资源
    最近更新 更多