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쉘 변수의 값을 전달하고 싶다고 알려야 합니다 . 함수 정의에서 다음과 같은 것이 트릭을 수행해야 합니다.

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}";
}

관련 정보