Можем ли мы использовать переменные оболочки в AWK, такие как $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
. Этот сценарий (в настоящее время) демонстрирует, почему это ценная функция.Возможный дубликат Как использовать переменные оболочки в сценарии awk
также см. unix.stackexchange.com/questions/120788/… - использование массива ENVIRON предпочтительнее -v из-за проблем с экранированием '\'