我们是否可以在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数据库管理员,我们有很多导入请求。我正在尝试使用脚本自动化这个过程。该脚本将查找转储文件中的用户,并提示选择哪些用户需要加载转储文件。
假设转储文件中有两个用户AKHIL
, SWATHI
(转储文件中可能还有其他用户,我想导入更多的用户)。我想将这些转储文件导入到新用户AKHIL_NEW
和SWATHI_NEW
。因此,输入应该类似于AKHIL:AKHIL_NEW,SWATHI:SWATHI_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[*]}
在最后一个impdp命令中,我需要使用变量获取转储中的原始用户,即AKHIL、SWATHI。
elif [[ $USER = WWF* ]]; then
来避免条件超出页面右侧和大量的fi
。这个脚本(目前)展示了为什么这是一个有价值的功能。 - Jonathan Leffler