Como obtenho um campo na lista de tarefas do bash usando o awk?

Como obtenho um campo na lista de tarefas do bash usando o awk?

Eu queria escrever uma função para recuperar um campo da lista de trabalhos em segundo plano no bash. Por exemplo, para obter um argumento específico.

Digamos que eu envie o vim para segundo plano, então "jobs" exibe esta lista:

[1]+  Stopped                 vim ~/.bashrc

Minha função fica assim:

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

Eu então chamo assim:

jf 1 4

Eu gostaria que ele retornasse a 4ª coluna da 1ª linha, que seria "~/.bashrc", mas isso não acontece. O que estou fazendo de errado?

Responder1

Você precisa informar awkque deseja passar valores de variáveis ​​​​do shell. Algo assim na definição da sua função deve resolver:

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

Responder2

As aspas simples fizeram com que o bash não substituísse argumentos. Como manatwork mencionou, as aspas duplas são interpretadas de forma menos estrita.

manatwork escreveu:

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

Ainda assim, a parte "echo `...`" na minha função representou um problema, mas parece que compliquei as coisas e não é necessário. Esta nova função funciona para mim:

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

informação relacionada