Use uma variável de shell com Awk

0

Eu tenho isso:

if [[ $1 = "-c" ]] && [[ $2 =~ ^[a-z A-Z]+$ ]]
then
awk -v var="$2" '{print $2}' something.txt
fi

O que eu quero é com um comando como -c abc para mostrar as linhas em algo.txt que incluem abc .

    
por ted 09.01.2016 / 21:07

2 respostas

2

Use o grep:

grep abc something.txt

Observe também que usar $2 no shell refere-se ao segundo argumento (como você parece saber), mas em awk é diferente. Sua pergunta parece mostrar um mal-entendido disso, então eu vou esclarecê-lo.

O shell requer que o $ se refira ao valor de uma variável. Então você se refere a uma variável chamada myvar escrevendo $myvar .

Em awk para se referir a uma variável chamada myvar , basta usar seu nome - myvar . Para se referir a uma string literal contendo as letras m-y-v-a-r, você digita "myvar" .

O $ em awk refere-se ao campo com um número específico. Portanto, $2 refere-se ao segundo campo da linha atual do arquivo. Ou se você definir myvar = "4" , então $myvar refere-se ao campo quarto do arquivo.

Para imprimir apenas todas as linhas de um arquivo que correspondem a um determinado padrão, use grep - é para isso que ele foi projetado.

    
por 09.01.2016 / 22:09
2

apenas como aviso legal, o awk não é a ferramenta certa para esse trabalho - suponho que seu caso de uso real seja mais complexo e justificado, então, obrigado por destilá-lo!

Esse issuse específico parece se resumir a duas coisas, variável "expansion" e passando argumentos do bash para o awk.

variáveis awk e $

uma vez que você prefixar uma variável awk com $ , ela será imediatamente uma referência a um campo: o que é estranho se você estiver acostumado com o shell, php ou perl.

então uma entrada como essa

thing alive
cat yes
lamp no

canalizado através de awk 'BEGIN{alive=2}{print $alive}' produzirá

alive
yes
no

enquanto awk 'BEGIN{alive=2}{print alive}' renderia

2
2
2

Quando misturando o awk com o bash, as coisas ficam um pouco estranhas; espero que ajude com a primeira parte.

passando argumentos do bash para o awk

se você estiver usando o awk e configurando o awk vars no comando bash, provavelmente está procurando por isso:

if [[ $1 = "-c" ]] && [[ $2 =~ ^[a-z A-Z]+$ ]]
then
    awk -v var="$2" 'index($0, var)' something.txt
fi

nota: o index($0, var) é a abreviação de if (index($0, var)) { print $0 }

reconhecidamente, não é uma solução "bonita", mas isso volta ao awk sendo a ferramenta errada para o trabalho. Para uma solução completa do awk, consulte ARGV e ARGC

    
por 09.01.2016 / 22:19

Tags