셸 변수와 함께 awk -v를 사용하면 제대로 작동하고 터미널에 인쇄되지만 파일로 리디렉션되면 첫 번째 레코드만 파일에 인쇄됩니다.

셸 변수와 함께 awk -v를 사용하면 제대로 작동하고 터미널에 인쇄되지만 파일로 리디렉션되면 첫 번째 레코드만 파일에 인쇄됩니다.

일치하는 패턴이 있는 파일을 읽고 패턴을 일치시킨 후 처음 5줄을 가져옵니다. 패턴의 숫자 순서가 정확하지 않으므로 패턴의 숫자 변수를 사용하여 각 레코드 세트를 숫자 순서로 반복합니다. 9개의 레코드를 모두 숫자 순서대로 터미널에 인쇄하지만, 파일로 리디렉션하면 터미널에는 아무 것도 인쇄되지 않고 파일의 첫 번째 레코드만 인쇄됩니다. 변수를 증가시키는 대신 일치하는 패턴에 숫자 값을 삽입하면 터미널에 인쇄되고 패턴 1 - 9만 일치합니다. 문제를 일으키는 라인입니다.

awk -v data="$devnum" '$0~data{print $0
 for (i=1; i<=5; i++) {getline; print}}' $data > $devicedata

rm하면 터미널에 인쇄하고, 일치하는 패턴으로 > $devicedata바꾸면 세 번째 레코드와 다음 4줄을 터미널에 인쇄하고 파일로 출력합니다. 잘못된 형식이 있으면 사과드립니다. 어떤 도움을 주셔서 감사합니다! 업데이트의 경우 문제를 "모호한 리디렉션"으로 처리해야 한다고 생각합니다. 나는 tee 명령에 파이프를 연결하고 >>를 추가하려고 시도했지만 리디렉션에 2>&1을 사용하여 잊어버렸던 "모호한 리디렉션"을 제거했습니다. $data=devices.txt 및 $devicedata=devicedata.txt."$devnum"/device 3/

답변1

리디렉션과 관련된 문제가 무엇이든 -v와는 아무 관련이 없습니다. 스크립트를 실행하세요http://shellcheck.net그리고 그것이 말하는 문제를 해결하세요.

현재 증상은 devicedata에 저장된 값에 공백이 포함되어 있기 때문에 거의 확실하므로 > $devicedata여러 리디렉션 대상으로 인용되지 않은 확장이므로 인용하면 > "$devicedata"모호한 리디렉션이 해결되지만 이것이 유일한 문제는 아닐 수도 있습니다.

다음은 bash에서 모호한 리디렉션 오류를 얻는 방법에 대한 예입니다.

$ devicedata='foo'
$ echo 'hi' > $devicedata

$ devicedata='foo bar'
$ echo 'hi' > $devicedata
-bash: $devicedata: ambiguous redirect

해당 오류 메시지를 제거하는 방법은 다음과 같습니다.

$ echo 'hi' > "$devicedata"
$

이제 알아내야 할 남은 것은 devicedata변수에 공백이 포함된 이유와 이것이 원하는/기대하는 것인지 여부입니다.

셸의 따옴표는 필요할 때 추가하는 것이 아니라 기본적으로 설정하고 필요할 때 제거하는 것입니다. 그렇게 하지 말아야 하는 특별한 이유가 없고 이러한 따옴표 제거의 의미를 완전히 이해하지 않는 한 셸에서는 항상 큰따옴표로 묶인 변수를 사용해야 합니다.https://mywiki.wooledge.org/Quotes.

shellcheck 등을 실행한 후에도 여전히 문제가 있는 경우 최소한의 완전한 쉘 스크립트를 게시하십시오. 그러면 문제가 awk 스크립트와 관련이 없으므로 디버그하는 데 도움을 드릴 수 있습니다. 그렇긴 하지만, 당신이 하고 싶은 일은 getline을 사용해야 하는 경우가 아닙니다.https://stackoverflow.com/questions/17908555/printing-with-sed-or-awk-a-line-following-a-matching-pattern/17914105#17914105, 그렇게 부르면 안 되는 경우 awk.freeshell.org/AllAboutGetline을 참조하세요.

FWIW 나는 (테스트되지 않은) 스크립트를 다음과 같이 작성합니다.

awk -v devnum="$devnum" '$0~devnum{c=5} c&&c--' "$data" > "$devicedata"

data한 가지 목적으로 awk 변수 이름으로 사용하고, data전혀 다른 목적으로 쉘 변수 이름으로 사용하는 것이 혼란스러워서 그 중 하나의 이름을 변경했습니다.

관련 정보