我们可以在awk中使用shell变量吗?

我们可以在awk中使用shell变量吗?,awk,Awk,我们可以在AWK中使用shell变量,比如$VAR,而不是$1,$2?例如: UL=(AKHIL:AKHIL_NEW,SWATHI:SWATHI_NEW) NUSR=`echo ${UL[*]}|awk -F, '{print NF}'` echo $NUSR echo ${UL[*]}|awk -F, '{print $NUSR}' 实际上,我是oracle DBA,我们收到很多导入请求。我正在尝试使用脚本将其自动化。脚本将查找转储中的用户,并提示需要加载转储的用户 假设转储有两个用户AK

我们可以在AWK中使用shell变量,比如
$VAR
,而不是
$1
$2
?例如:

UL=(AKHIL:AKHIL_NEW,SWATHI:SWATHI_NEW)

NUSR=`echo ${UL[*]}|awk -F, '{print NF}'`
echo $NUSR
echo ${UL[*]}|awk -F, '{print $NUSR}'
实际上,我是oracle DBA,我们收到很多导入请求。我正在尝试使用脚本将其自动化。脚本将查找转储中的用户,并提示需要加载转储的用户

假设转储有两个用户
AKHIL
SWATHI
(转储中可能有用户,我想导入更多的用户)。我想将转储导入新用户
AKHIL_new
SWATHI_new
。因此,要读取的输入可能类似于
AKHIL:AKHIL\u NEW,SWATHI:SWATHI\u NEW

首先,我需要找到要创建的用户数量,然后我需要从我们提供的输入中获得新用户,即
AKHIL_new,SWATHI_new
。这样我就可以连接到数据库,创建新用户,然后导入。我不是复制整个代码:我只是从它接受用户输入的地方复制代码

UL=(AKHIL:AKHIL_NEW,SWATHI:SWATHI_NEW) ## it can be many users like     USER1:USER1_NEW,USER2_USER2_NEW,USER3:USER_NEW..

NUSR=`echo ${UL[*]}|awk -F, '{print NF}'` #finding  number of fields or users
y=1
while [ $y -le $NUSR ] ; do
    USER=`echo ${UL[*]}|awk -F, -v NUSR=$y  '{print $NUSR}' |awk -F: '{print $2}'` #getting     Users to created AKHIL_NEW and SWATHI_NEW and passing to SQLPLUS
    if [[ $USER = SCPO* ]]; then
        TBS=SCPODATA
    else
        if [[ $USER = WWF* ]]; then
            TBS=WWFDATA
        else
            if [[ $USER = STSC* ]]; then
                TBS=SCPODATA
            else
                if [[ $USER = CSM* ]]; then
                    TBS=CSMDATA
                else
                    if [[ $USER = TMM* ]]; then
                        TBS=TMDATA
                    else
                        if [[ $USER = IGP* ]]; then
                        TBS=IGPDATA
                        fi
                    fi
                fi
             fi
        fi
    fi

    sqlplus -s '/ as sysdba'  <<EOF   # CREATING the USERS in the database 
    CREATE USER $USER IDENTIFIED BY $USER  DEFAULT TABLESPACE $TBS TEMPORARY TABLESPACE TEMP QUOTA 0K on SYSTEM QUOTA UNLIMITED ON $TBS;

    GRANT
    CONNECT,
       CREATE TABLE,
       CREATE VIEW,
       CREATE SYNONYM,
       CREATE SEQUENCE,
       CREATE DATABASE LINK,
       RESOURCE,
       SELECT_CATALOG_ROLE
    to $USER;
    EOF 
    y=`expr $y + 1`
done

impdp sysem/manager DIRECTORY=DATA_PUMP DUMPFILE=imp.dp logfile=impdp.log SCHEMAS=AKHIL,SWATHI REMPA_SCHEMA=${UL[*]} 
UL=(AKHIL:AKHIL_NEW,SWATHI:SWATHI_NEW)##它可以是许多用户,如USER1:USER1_NEW,USER2_USER2_NEW,USER3:USER_NEW。。
NUSR=`echo${UL[*]}awk-F,{print NF}``查找字段或用户的数量
y=1
而[$y-le$NUSR];做
USER=`echo${UL[*]}awk-F,-v NUSR=$y'{print$NUSR}'| awk-F:'{print$2}``让用户创建AKHIL_NEW和SWATHI_NEW并传递给SQLPLUS
如果[[$USER=SCPO*];然后
TBS=SCPODATA
其他的
如果[[$USER=WWF*];然后
TBS=WWFDATA
其他的
如果[[$USER=STSC*];然后
TBS=SCPODATA
其他的
如果[[$USER=CSM*];然后
TBS=CSMDATA
其他的
如果[[$USER=TMM*];然后
TBS=TMDATA
其他的
如果[[$USER=IGP*];然后
TBS=IGPDATA
fi
fi
fi
fi
fi
fi
sqlplus-s'/as sysdba'是的,您可以在awk中使用shell变量。有很多方法可以做到这一点,但我最喜欢的是使用
-v
标志定义一个变量:

$ echo | awk -v my_var=4 '{print "My var is " my_var}'
My var is 4
只需将环境变量作为参数传递给
-v
标志。例如,如果您有此变量:

$ VAR=3
$ echo $VAR
3
这样使用它:

$ echo | awk -v env_var="$VAR" '{print "The value of VAR is " env_var}'
The value of VAR is 3
当然,您可以使用相同的名称,但不需要使用
$

$ echo | awk -v VAR="$VAR" '{print "The value of VAR is " VAR}'
The value of VAR is 3

关于awk中的
$
的注意事项:与bash、Perl、PHP等不同,它不是变量名称的一部分,而是。

有两种方法可以将变量传递给
awk
:一种方法是在命令行参数中定义变量:

$ echo ${UL[*]}|awk -F, -v NUSR=$NUSR '{print $NUSR}'
SWATHI:SWATHI_NEW
另一种方法是使用
export
将shell变量转换为环境变量,并从
ENVIRON
数组中读取环境变量:

$ export NUSR
$ echo ${UL[*]}|awk -F, '{print $ENVIRON["NUSR"]}'
SWATHI:SWATHI_NEW
2016年更新:OP有逗号分隔的数据,希望提取给定索引的项目。索引位于shell变量
NUSR
中。
NUSR
的值被传递给
awk
,而
awk
的美元操作符提取项目

请注意,将UL声明为多个元素的数组,并在
bash
中进行提取,并将
awk
从等式中完全去掉,会更简单。但是,它使用基于0的索引

UL=(AKHIL:AKHIL_NEW SWATHI:SWATHI_NEW)
NUSR=1
echo ${UL[NUSR]} # prints SWATHI:SWATHI_NEW

不可以。您可以将shell变量的值传递给awk脚本,就像您可以将shell变量的值传递给C程序一样,但是您无法访问awk脚本中的shell变量,正如您无法访问C程序中的shell变量一样。与C一样,awk不是shell。参见cfajohnson.com/shell/cus-FAQ-2.html#Q24上comp.unix.shell常见问题解答中的问题24

编写代码的一种方法是:

UL="AKHIL:AKHIL_NEW,SWATHI:SWATHI_NEW"
NUSR=$(awk -F, -v ul="$UL" 'BEGIN{print gsub(FS,""); exit}')
echo "$NUSR"
echo "$UL" | awk -F, -v nusr="$NUSR" '{print $nusr}' # could have just done print $NF
但从你最初的出发点:

UL=(AKHIL:AKHIL_NEW,SWATHI:SWATHI_NEW)

如果将UL声明为只包含一个条目的数组,您可能需要重新考虑您试图执行的任何操作,因为您可能采用了完全错误的方法。

Awk和Gawk提供了包含所有导出环境变量的
环境关联数组。因此,在awk脚本中,您可以使用
ENVIRON[“VarName”]
获取VarName的值,前提是在运行awk之前已导出VarName

ENVIRON
是一个预定义的awk变量,而不是shell环境变量

因为我没有足够的声誉来评论其他的答案,所以我必须把它们包括在这里

前面显示
$ENVIRON
的答案是不正确的-语法会被shell扩展,可能会导致扩展为空


先前关于C无法访问环境变量的进一步评论是错误的。与上面所说的相反,C(和C++)可以使用
getenv(“VarName”)
函数访问环境变量。许多其他语言提供类似的访问(例如,Java:
System.getenv()
、Python:
os.environ
、Haskell System.Environment等)。注意:在所有情况下,对环境变量的访问都是只读的,您不能在程序中更改环境变量并将该值返回到调用脚本。

不确定我是否理解您的问题

但是假设我们得到了一个变量
number=3
,我们想用它代替
$3
,在awk中,我们可以用下面的代码

results="100 Mbits/sec 110 Mbits/sec 90 Mbits/sec"
number=3    
speed=$(echo $results | awk '{print '"\$${number}"'}')
因此,速度变量将获得值110


希望这能有所帮助。

还有另一种方法,但它可能会造成巨大的混乱:

$ VarName="howdy" ; echo | awk '{print "Just saying '$VarName'"}'
Just saying howdy
$

因此,您暂时退出单引号环境(这通常会阻止shell解释“$”),以解释变量,然后返回到它。它的优点是相对简单。

问题又是什么?shell提供了
elif[[$USER=WWF*];然后
以避免出现脱离页面右侧的情况和
fi的SCAD