Colocando variáveis de shell em awk
pode ser feito de várias maneiras. Alguns são melhores que outros. Isso deve cobrir a maioria deles. Se você tiver um comentário, por favor deixe abaixo. v1.5
Usando -v
(da melhor maneira, mais portátil)
Use a -v
opção: (PS use um espaço depois -v
ou será menos portátil. Por exemplo, awk -v var=
não awk -vvar=
)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
Isso deve ser compatível com a maioria awk
e a variável também está disponível no BEGIN
bloco:
Se você tiver várias variáveis:
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
Atenção . Como escreve Ed Morton, as seqüências de escape serão interpretadas para que \t
se tornem reais tab
e não \t
se é isso que você procura. Pode ser resolvido usando ENVIRON[]
ou acessando-o viaARGV[]
PS Se você gosta de três barras verticais como separador |||
, elas não podem ser escapadas, então use-F"[|][|][|]"
Exemplo de como obter dados de uma pousada de programa / função para awk
(aqui a data é usada)
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
Variável após bloco de código
Aqui nós obtemos a variável após o awk
código. Isso funcionará bem, desde que você não precise da variável no BEGIN
bloco:
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
- Adicionando várias variáveis:
awk '{print a,b,$0}' a="$var1" b="$var2" file
- Dessa forma, também podemos definir diferentes separadores de campo
FS
para cada arquivo.
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- Variável após o bloco de código não funcionará para o
BEGIN
bloco:
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
Here-string
A variável também pode ser adicionada ao awk
uso de uma string here de shells que os suportam (incluindo o Bash):
awk '{print $0}' <<< "$variable"
test
É o mesmo que:
printf '%s' "$variable" | awk '{print $0}'
PS trata a variável como uma entrada de arquivo.
ENVIRON
entrada
Enquanto o TrueY escreve, você pode usar o ENVIRON
para imprimir variáveis de ambiente . Definindo uma variável antes de executar o AWK, você pode imprimi-la assim:
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV
entrada
Como escreve Steven Penny, você pode usar ARGV
para colocar os dados no awk:
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
Para inserir os dados no próprio código, não apenas o BEGIN:
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
Variável dentro do código: USE COM CUIDADO
Você pode usar uma variável dentro do awk
código, mas é confuso e difícil de ler e, como Charles Duffy
aponta, esta versão também pode ser vítima de injeção de código. Se alguém adicionar coisas ruins à variável, ela será executada como parte do awk
código.
Isso funciona extraindo a variável dentro do código, tornando-se parte dela.
Se você deseja fazer uma awk
alteração dinâmica dinamicamente com o uso de variáveis, pode fazê-lo desta maneira, mas NÃO o use para variáveis normais.
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
Aqui está um exemplo de injeção 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
Você pode adicionar muitos comandos awk
dessa maneira. Até mesmo travar com comandos não válidos.
Informação extra:
Uso de aspas duplas
É sempre bom fazer aspas duplas. "$variable"
Caso contrário, várias linhas serão adicionadas como uma única linha longa.
Exemplo:
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
Outros erros que você pode obter sem aspas:
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
E com aspas simples, ele não expande o valor da variável:
awk -v var='$variable' 'BEGIN {print var}'
$variable
Mais informações sobre AWK e variáveis
Leia este FAQ .