¿Podemos usar variables de shell en awk?

¿Podemos usar variables de shell en AWK como $VAR lugar de $1 , $2 ? Por ejemplo:

 UL=(AKHIL:AKHIL_NEW,SWATHI:SWATHI_NEW) NUSR=`echo ${UL[*]}|awk -F, '{print NF}'` echo $NUSR echo ${UL[*]}|awk -F, '{print $NUSR}' 

De hecho, soy un DBA oracle, recibimos muchas solicitudes de importación. Intento automatizarlo usando el script. La secuencia de comandos encontrará a los usuarios en el volcado e indicará a los usuarios a los que se debe cargar el volcado.

Supongamos que los volcados tienen dos usuarios, AKHIL , SWATHI (puede haber usuarios en el vertedero y yo quiero importar más usuarios). Quiero importar los volcados a los nuevos usuarios AKHIL_NEW y SWATHI_NEW . Por lo tanto, la información que debe leerse algunos piense como AKHIL:AKHIL_NEW,SWATHI:SWATHI_NEW .

Primero, necesito encontrar la cantidad de usuarios que se crearán, luego necesito obtener nuevos usuarios, es decir AKHIL_NEW,SWATHI_NEW partir de la información que hemos proporcionado. Para poder conectarme a la base de datos, crear nuevos usuarios y luego importar. No estoy copiando todo el código: acabo de copiar el código desde donde acepta los usuarios de entrada.

 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[*]} 

En el último comando impdp necesito obtener los usuarios originales en los depósitos, es decir, AKHIL, SWATHI usando las variables.

Sí, puedes usar las variables de shell dentro de awk. Hay muchas maneras de hacerlo, pero mi favorito es definir una variable con el indicador -v :

 $ echo | awk -v my_var=4 '{print "My var is " my_var}' My var is 4 

Simplemente pase la variable de entorno como parámetro al indicador -v . Por ejemplo, si tienes esta variable:

 $ VAR=3 $ echo $VAR 3 

Úselo de esta manera:

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

Por supuesto, puede dar el mismo nombre, pero $ no será necesario:

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

Una nota sobre $ en awk : a diferencia de bash, Perl, PHP, etc., no forma parte del nombre de la variable, sino que es un operador .

Awk y Gawk proporcionan la matriz asociativa ENVIRON que contiene todas las variables de entorno exportadas. Entonces en su script awk puede usar ENVIRON [“VarName”] para obtener el valor de VarName, siempre que VarName haya sido exportado antes de ejecutar awk.

Nota ENVIRON es una variable awk predefinida NO una variable de entorno de shell.

Como no tengo suficiente reputación para comentar sobre las otras respuestas, ¡las tengo que incluir aquí!

La respuesta anterior que muestra $ ENVIRON es incorrecta: la syntax se expandiría por el shell y probablemente se expandiría a nada.

Otros comentarios anteriores acerca de que C no puede acceder a la variable de entorno es incorrecto. Al contrario de lo que se dijo anteriormente, C (y C ++) pueden acceder a variables de entorno utilizando la función getenv (“VarName”). Muchos otros lenguajes proporcionan un acceso similar (por ejemplo, Java: System.getenv (), Python: os.environ, Haskell System.Environment, …). Tenga en cuenta que, en todos los casos, el acceso a las variables de entorno es de solo lectura, no puede cambiar una variable de entorno en un progtwig y devolver ese valor al script de llamada.

Hay dos formas de pasar variables a awk : una forma es definir la variable en un argumento de línea de comando:

 $ echo ${UL[*]}|awk -F, -v NUSR=$NUSR '{print $NUSR}' SWATHI:SWATHI_NEW 

Otra forma es convertir la variable de shell en una variable de entorno mediante export y leer la variable de entorno de la matriz ENVIRON :

 $ export NUSR $ echo ${UL[*]}|awk -F, '{print $ENVIRON["NUSR"]}' SWATHI:SWATHI_NEW 

Actualización 2016: el OP tiene datos separados por comas y desea extraer un elemento dado su índice. El índice está en la variable de shell NUSR . El valor de NUSR se pasa a awk , y el operador de dólar de awk extrae el elemento.

Tenga en cuenta que sería más sencillo declarar a UL como una matriz de más de un elemento, y hacer la extracción en bash , y sacar a awk de la ecuación por completo. Sin embargo, esto usa indización basada en 0.

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

Hay otra manera, pero podría causar una inmensa confusión:

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

Por lo tanto, está saliendo temporalmente del entorno de presupuesto único (lo que normalmente evitaría que el intérprete de comandos interprete ‘$’) para interpretar la variable y volver a ella. Tiene la virtud de ser relativamente breve.

No estoy seguro si entiendo tu pregunta.

Pero digamos que tenemos un number=3 variable number=3 y queremos usarlo en lugar de $3 , en awk podemos hacer eso con el siguiente código

 results="100 Mbits/sec 110 Mbits/sec 90 Mbits/sec" number=3 speed=$(echo $results | awk '{print '"\$${number}"'}') 

entonces la variable de velocidad obtendrá el valor 110.

Espero que esto ayude.

No. Puede pasar el valor de una variable de shell a un script awk del mismo modo que puede pasar el valor de una variable de shell a un progtwig C, pero no puede acceder a una variable de shell en un script awk más de lo que podría acceder a una variable de shell en un progtwig C Al igual que C, awk no es shell. Consulte la pregunta 24 en las preguntas frecuentes de comp.unix.shell en cfajohnson.com/shell/cus-faq-2.html#Q24.

Una forma de escribir tu código sería:

 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 

pero desde su punto de partida original:

 UL=(AKHIL:AKHIL_NEW,SWATHI:SWATHI_NEW) 

estaba declarando a UL como una matriz con solo una entrada, es posible que desee reconsiderar lo que sea que esté tratando de hacer, ya que puede tener un enfoque completamente equivocado.