Pasar variable a Linux 'awk'

Pasar variable a Linux 'awk'

¿Cómo puedo pasar una variable previamente definida a awk en bash? Por ejemplo,

hostname="server1" cat /etc/passwd | awk -F":" '{print $1 " of $hostname"}

Y el resultado esperado es

root of server1
sys of server1
......
......  // for all user accounts

Pero lo que obtengo es

root of $hostname
sys of $hostname

Respuesta1

Tienes un problema de cotización:

Al incluir caracteres entre comillas simples ('''), se conserva el valor literal de cada carácter entre comillas. No puede aparecer una comilla simple entre comillas simples, incluso si van precedidas de una barra invertida.

(deManual de referencia de bash).

Todo lo que necesitas hacer es colocar $hostnamefuera de las comillas simples:

cat /etc/passwd | awk -F":" '{print $1 " of '$hostname'"}'

o utilice comillas dobles y escape algunos caracteres con \:

cat /etc/passwd | awk -F":" "{print \$1 \" of $hostname\"}"

Respuesta2

awktiene una opción variable incorporada con -v.

cat /etc/passwd | awk -F":" -v hostname="server1" '{print $1 " of " hostname}

información relacionada