Unix 핵심 유틸리티가 스크립트에서 공백을 인식하지 못하는 이유는 무엇입니까?

Unix 핵심 유틸리티가 스크립트에서 공백을 인식하지 못하는 이유는 무엇입니까?

저는 비트코인 ​​가격을 끌어올리기 위한 짧은 스크립트를 작성하고 있습니다. 이 정보는 i3block으로 전달되어 상태 표시줄에서 시간당 가격을 볼 수 있습니다. 이것이 지금까지 제가 가지고 있는 정보입니다.

#!/bin/bash
price=$(curl -s gbp.rate.sx/btc?T | tail -3 | head -1 | grep -o '[0-9]*' | cut -d ' ' -f1)
echo $price

비트코인 가격을 GBP로 계산했습니다.rate.sxT 옵션(텍스트만, ANSI 시퀀스 없음)을 사용하여 Head 및 Tail을 사용하여 평균 가격 라인을 선택하고 숫자를 파악합니다. 출력은 다음과 같습니다.

26563 26396 1738 8 6 29

첫 번째 숫자는 평균 가격이고 다른 숫자는 중앙값, 변형 등입니다. 보시다시피 공백을 구분 기호로 사용하여 클리핑을 통해 전달하고 있지만 출력이 클리핑되지 않습니다.

또한 출력을 csv로 변환하려고 공백을 ","로 바꾸려고 시도했지만 실패했습니다.

price=$(curl -s gbp.rate.sx/btc?T | tail -3 | head -1 | grep -o '[0-9]*' | sed 's/ /,/' )

위의 내용도 동일한 결과를 제공합니다. 공백을 식별하는 데 cut어려움을 겪는 이유는 무엇입니까 sed?

답변1

자신의 파이프라인에서 발생하는 문제는 출력이 grep여러 개 라는 사실을 인식하지 못한다는 것입니다.철사길이는 한 줄에 하나의 정수입니다. 숫자는 $price따옴표 없이 사용했기 때문에 같은 줄에만 출력됩니다 .


평균 가격, 즉 라벨 뒤의 금액을 원하는 경우 avg:가장 간단한 방법은 다음과 같습니다 awk.

curl -s 'https://gbp.rate.sx/btc?T' |
awk '/^avg:/ { print $2 }'

위의 코드 awk는 text 로 시작하는 각 줄의 두 번째 공백으로 구분된 필드를 인쇄합니다 avg:.

이것 은 당신 에게 이와 같은 것을 줄 것입 니다 £26421. 파운드 기호 없이 금액을 원하면 print substr($2,2)대신 을 사용하세요 print $2.

grepand cut와 다음과 같은 것을 사용하여 이 작업을 수행하시겠습니까?

curl -s 'https://gbp.rate.sx/btc?T' |
grep '^avg:' | cut -d ' ' -f 2

파운드 기호를 제거하려면 파이프로 연결하거나 cut -c 2-끝에 tr -d '£'넣으세요.

단지 결과를 출력하는 것이라면 애초에 결과를 변수에 넣을 이유가 없다는 점에 유의하세요.

답변2

출력은 다음과 같습니다.

echo $price
26563 26396 1738 8 6 29

$price이는 인용되지 않았기 때문에 쉘이 공백으로 분할하기 때문 입니다 . echo여러 매개변수를 가져와 단일 공백으로 연결합니다.

예를 들면 다음을 참조하세요.언제 큰따옴표가 필요합니까?

관련 정보