我们可以在awk中使用shell变量吗?
我们可以在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
$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