Obtener variables de shell en awk
Se puede hacer de varias maneras. Algunos son mejores que otros. Esto debería cubrir la mayoría de ellos. Si tienes un comentario, déjalo a continuación. v1.5
Usando -v
(La mejor manera, más portátil)
Use la -v
opción: (PS usa un espacio después -v
o será menos portátil. Por ejemplo, awk -v var=
no awk -vvar=
)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
Esto debería ser compatible con la mayoría awk
, y la variable también está disponible en el BEGIN
bloque:
Si tienes múltiples variables:
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
Advertencia . Como escribe Ed Morton, las secuencias de escape se interpretarán, por lo que se \t
convierte en algo real tab
y no \t
si eso es lo que buscas. Se puede resolver mediante el uso ENVIRON[]
o el acceso a través deARGV[]
PD: si le gustan tres barras verticales como separador |||
, no se puede escapar, así que use-F"[|][|][|]"
Ejemplo sobre cómo obtener datos de un programa / función inn a awk
(aquí se usa la fecha)
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
Variable después del bloque de código
Aquí obtenemos la variable después del awk
código. Esto funcionará bien siempre que no necesite la variable en el BEGIN
bloque:
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
- Agregar múltiples variables:
awk '{print a,b,$0}' a="$var1" b="$var2" file
- De esta manera, también podemos establecer diferentes separadores de campo
FS
para cada archivo.
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- La variable después del bloque de código no funcionará para el
BEGIN
bloque:
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
Here-string
La variable también se puede agregar al awk
uso de una cadena aquí de los shells que los admiten (incluido Bash):
awk '{print $0}' <<< "$variable"
test
Esto es lo mismo que:
printf '%s' "$variable" | awk '{print $0}'
PD: trata la variable como una entrada de archivo.
ENVIRON
entrada
Como TrueY escribe, puede usar ENVIRON
para imprimir Variables de entorno . Al configurar una variable antes de ejecutar AWK, puede imprimirla así:
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV
entrada
Como escribe Steven Penny, puede usar ARGV
para obtener los datos en awk:
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
Para obtener los datos en el propio código, no solo el COMIENZO:
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
Variable dentro del código: USO CON PRECAUCIÓN
Puede usar una variable dentro del awk
código, pero es desordenada y difícil de leer, y como Charles Duffy
señala, esta versión también puede ser víctima de la inyección de código. Si alguien agrega cosas malas a la variable, se ejecutará como parte del awk
código.
Esto funciona extrayendo la variable dentro del código, por lo que se convierte en parte de él.
Si desea hacer un awk
cambio dinámico con el uso de variables, puede hacerlo de esta manera, pero NO lo use para variables normales.
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
Aquí hay un ejemplo de inyección de código:
variable='line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
1
2
3
.
.
1000
Puede agregar muchos comandos de awk
esta manera. Incluso haz que se bloquee con comandos no válidos.
Información extra:
Uso de comillas dobles
Siempre es bueno comillas dobles. "$variable"
Si no, se agregarán varias líneas como una sola línea larga.
Ejemplo:
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
Otros errores que puede obtener sin comillas dobles:
variable="line one\nline two"
awk -v var=$variable 'BEGIN {print var}'
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ syntax error
Y con comillas simples, no expande el valor de la variable:
awk -v var='$variable' 'BEGIN {print var}'
$variable
Más información sobre AWK y variables
Lee este faq .