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가 매개변수를 대체하는 것을 방지합니다. 언급한 것처럼 큰따옴표는 덜 엄격하게 해석됩니다.

Manat Walker는 다음과 같이 썼습니다.

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

그래도 내 기능의 "echo `...`" 부분이 문제를 일으키고 있지만 너무 복잡해서 전혀 필요하지 않은 것 같습니다. 이 새로운 기능은 저에게 효과적입니다.

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

관련 정보