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

标签 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,我们收到很多导入请求。我正在尝试使用脚本使其自动化。该脚本将找出转储中的用户,并提示需要加载转储的用户。

假设转储有两个用户AKHILSWATHI(转储中可能有很多用户,我想导入更多数量的用户)。我想将转储导入到新用户 AKHIL_NEWSWATHI_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。

最佳答案

是的,您可以在 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 等不同,它不是变量名称的一部分,而是 an operator .

关于awk - 我们可以在 awk 中使用 shell 变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15786777/

相关文章:

Bash,从字符串中用点字符剪切单词

bash - 从文件名中提取变量名

linux - 如何从 dhcpd.conf 中删除租约?

unix - 查找与模式匹配的行,前提是它们在指定列中的值在输入文件中恰好出现两次

bash - 基于两列连接两个文件

regex - 使用来自 AWK 的外部正则表达式库

linux - 获取 KSH 名称

awk粘贴比较打印

python - 什么最适合字符串提取或模式匹配 regex/awk/emacs lisp?

unix - 如何在 Unix 中删除文件中的重复行而不对其进行排序