Usa una variable de shell con Awk

Tengo esto:

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

Lo que quiero es usar un command como -c abc para mostrar las líneas en algo.txt que incluyen abc .

Use grep:

 grep abc something.txt 

También tenga en count que usar $2 en el shell se refiere al segundo argumento (como parece saber), pero en awk es diferente. Su pregunta parece mostrar un malentendido de esto, así que lo aclararé.

El shell requiere $ para referirse al valor de una variable. Entonces te refieres a una variable llamada myvar escribiendo $myvar .

En awk para referirse a una variable llamada myvar , simplemente usa su nombre- myvar . Para hacer reference a una cadena literal que contiene las letras myvar, escriba "myvar" .

El $ en awk es referirse al campo con un número específico. Entonces, $2 refiere al segundo campo de la línea actual del file. O si establece myvar = "4" , entonces $myvar refiere al cuarto campo del file.

Para simplemente imprimir todas las líneas de un file que coincidan con un patrón dado, use grep , para eso está diseñado.

solo como un descargo de responsabilidad, awk no es la herramienta adecuada para este trabajo; supongo que su caso de uso real es más complejo y justificado, ¡así que gracias por destilarlo!

Este issuse específico parece que se networkinguce a dos cosas, variable "expansión" y pasar arguments de bash a awk.

awk variables y $

una vez que prefija una variable awk con $ , la convertirá inmediatamente en una reference a un campo: lo cual es extraño si está acostumbrado al shell, php o perl.

entonces una input como esta

 thing alive cat yes lamp no 

transmitido por awk 'BEGIN{alive=2}{print $alive}' producirá

 alive yes no 

mientras awk 'BEGIN{alive=2}{print alive}' rendiría

 2 2 2 

Al mezclar awk con bash, las cosas se ponen un poco extrañas; con suerte eso ayuda con la primera parte.

pasando args de bash a awk

si estás configurado para usar awk y configura awk vars en el command bash, probablemente estés buscando esto:

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

nota: el index($0, var) es la abreviatura de if (index($0, var)) { print $0 }


es cierto que no es una solución "bonita", pero que vuelve a ser una herramienta incorrecta para el trabajo. Para una solución completa de awk echa un vistazo a ARGV y ARGC