¿Cómo obtengo un campo en la lista de trabajos de bash usando awk?

¿Cómo obtengo un campo en la lista de trabajos de bash usando awk?

Quería escribir una función para recuperar un campo de la lista de trabajos en segundo plano en bash. Por ejemplo, para obtener un argumento específico.

Digamos que envío vim a segundo plano, por lo que "trabajos" muestra esta lista:

[1]+  Stopped                 vim ~/.bashrc

Mi función se ve así:

function jf {
    echo `jobs | awk 'NR==$1{print $$2}'`;
}

Entonces lo llamo así:

jf 1 4

Me gustaría que devolviera la cuarta columna de la primera línea, que sería "~/.bashrc", pero no es así. ¿Qué estoy haciendo mal?

Respuesta1

Debe indicar awkque desea pasar valores de variables de shell. Algo como esto en la definición de su función debería funcionar:

function jf {
    echo `jobs | awk -v LINENO=$1 -v COLUMNNO=$2 'NR==LINENO {print $COLUMNNO}'`
}

Respuesta2

Las comillas simples hicieron que bash no fuera un argumento sustituto. Como mencionó manatwork, las comillas dobles se interpretan de manera menos estricta.

manatwork escribió:

awk "NR==$1{print \$$2}"

Aún así, la parte "echo `...`" en mi función planteó un problema, pero parece que complicé demasiado las cosas y no es necesaria en absoluto. Esta nueva función me funciona:

function jf {
    jobs | awk "NR==$1{print \$$2}";
}

información relacionada