如何使用 awk 获取 bash 作业列表中的字段?

如何使用 awk 获取 bash 作业列表中的字段?

我想编写一个函数来从 bash 中的后台作业列表中检索字段。例如获取特定参数。

假设我将 vim 发送到后台,因此“jobs”显示此列表:

[1]+  Stopped                 vim ~/.bashrc

我的函数如下所示:

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

然后我这样称呼它:

jf 1 4

我希望它返回第一行的第四列,即“~/.bashrc”,但事实并非如此。我究竟做错了什么?

答案1

您需要表明awk您想要从 shell 变量传递值。在你的函数定义中类似这样的东西应该可以解决问题:

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

答案2

单引号使 bash 不能替代参数。正如 manatwork 提到的,双引号的解释不太严格。

马纳特沃克写道:

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

尽管如此,我的函数中的“echo `...`”部分还是带来了问题,但似乎我把事情变得过于复杂了,根本不需要它。这个新功能对我有用:

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

相关内容