Bash将Shell变量传递到Awk脚本

时间:2020-01-09 10:42:03  来源:igfitidea点击:

如何在Linux或者类似UNIX的操作系统下将Shell变量传递给awk命令或者脚本?
如何在awk脚本中使用shell变量?
如何允许awk使用shell变量?
有两种方法可以将命令行shell变量传递到awk脚本。
本教程说明如何使用各种方法将Shell变量放入awk。

Bash使用-v选项将Shell变量传递给Awk

-v选项可用于将shell变量传递给awk命令。
考虑以下简单示例:

root="/webroot"
echo | awk -v r=$root '{ print "shell variable $root value is " r}'

它可与在Linux,* BSD,macOS和类Unix系统上运行的各种版本的awk配合使用。

如何在awk脚本中使用shell变量?

该变量在BEGIN块中也可用。
例如:

a=5
awk -v var=$a 'BEGIN{ ans=var*2} { print ans}'<<</dev/null

如何将多个shell变量传递给awk

将多个`-v'传递给awk的语法如下:

x=10
y=30
text="Total is : "
awk -v a=$x -v b=$y -v c="$text" 'BEGIN {ans=a+b; print c " " ans}'

在Linux和类Unix系统上将命令行Shell变量传递给awk

AWK和命令替换

命令替换仅意味着运行shell命令并将其输出存储到变量或者使用echo命令显示回去。
例如,使用shell变量显示日期和时间:

today=$(date)
echo "$today"

可以允许awk使用通过命令替换创建的shell变量,如下所示:

## bash ##
awk -v today="$(date)" 'BEGIN {print today}'
 
## more portable ##
awk -v today="`date`" 'BEGIN {print "Today is " today}'

在此示例中,使用awk搜索文件如下:

#!/bin/bash
# Usage : Search word using awk for given file.
# Syntax: ./script "word-to-search" fileToSearch
s=
i=
awk -v search="$s" '
$ ./script.sh "Hyman" /etc/passwd
~ search' "$i"

保存并关闭文件。
如下运行:

Hyman:x:1000:1000:,,,:/home/Hyman:/bin/bash

输出示例:

echo "$BASH"
echo "$USER"
echo "$HOME"
export demo="Om nom nom"
awk 'BEGIN{print ENVIRON["HOME"]}'
awk 'BEGIN{print ENVIRON["demo"]}'
var="value" awk 'BEGIN{print ENVIRON["var"]}'
awk 'BEGIN{print "Hello, "ENVIRON["USER"], "! Home dir " ENVIRON["HOME"]}'

如何使用ENVIRON访问AWK中的Shell环境变量

您需要使用ENVIRONshell变量。
在gnu/awk手册页中:

包含当前环境值的数组。
该数组由环境变量索引,每个元素都是该变量的值(例如,ENVIRON [HOME]可能是/home/arnold)。
更改此数组不会影响gawk通过重定向或者system()函数生成的程序所看到的环境。

例如,使用awk打印$BASH和$USER shell变量:

awk 'BEGIN {print ARGV[0]}' 
os="Linux"
awk 'BEGIN {print ARGV[1]}' "$os"
a=10
b=20
awk 'BEGIN {print ARGV[1] " " ARGV[2]}' $a $b
awk 'BEGIN {total=ARGV[1] + ARGV[2]; print total}' $a $b

关于ARGV的说明

ARGV是传递给awk的命令行参数数组。
该数组的索引从0到ARGC1。
动态更改ARGV的内容可以控制用于数据的文件。
让我们看看如何将ARGV与awk和shell变量一起使用:

eval $(awk 'BEGIN{ print "vech=Bus"}' < /dev/null)
echo $vech

使用awk设置shell变量

您可以使用eval命令,如下所示:

Bus

输出示例:

##代码##