Как получить поле в списке заданий bash с помощью awk?

Как получить поле в списке заданий bash с помощью awk?

Я хотел написать функцию для извлечения поля из списка фоновых заданий в bash. Например, для получения определенного аргумента.

Допустим, я перевожу vim в фоновый режим, и «jobs» отображает следующий список:

[1]+  Stopped                 vim ~/.bashrc

Моя функция выглядит так:

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

Тогда я называю это так:

jf 1 4

Я хотел бы, чтобы он возвращал 4-й столбец 1-й строки, который будет "~/.bashrc", но он этого не делает. Что я делаю не так?

решение1

Вам нужно указать awk, что вы хотите передать значения из переменных оболочки. Что-то вроде этого в определении функции должно сработать:

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

решение2

Одинарные кавычки сделали bash не заменяющим аргументы. Как упомянул manatwork, двойные кавычки интерпретируются менее строго.

manatwork написал:

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

Тем не менее, часть "echo `...`" в моей функции создавала проблему, но, похоже, я слишком все усложнил, и она вообще не нужна. Эта новая функция работает для меня:

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

Связанный контент