如何使用 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}";
}

相關內容