자세한 세부 사항:

자세한 세부 사항:

주문하다: val=$( echo $text $len|awk '{print substr($0,0,$2)}')

위 명령은 잘 작동합니다. $0과 $2의 값이 무엇인지 알고 싶습니다. $0은 $text 값을 받아들이고 $2는 $len 값을 받아들인다는 것을 알고 있습니다. 하지만 1달러는 어떻습니까?

답변1

  • $0는 전체 라인이고, ( $text$len)
  • $2두 번째 인수는 ( $len)

처럼 보이지만 substr($0,0,$2)이어야 substr($1,0,$2)하지만 $len충분히 작으면(실제 길이보다 작으면 $text) 문제가 되지 않습니다.

한편으로는 다음 사항에 유의하시기 바랍니다.

val=${text:0:$len}

이렇게 하면 대부분의 셸에서 문제가 해결됩니다.

답변2

에서가 아니라 에서 awk계산이 시작되기 때문입니다 . 첫 번째 블록은 이고 , 두 번째 블록은 입니다 . 실제로 파이프로 연결하는 전체 라인 , 모든 청크를 함께 사용합니다.10$1$2$0awk

자세한 세부 사항:

좋아, 먼저 나는 이 일을 쉘에서 실행하고 있다고 가정합니다. 예를 들어 bash, 그 부분은 val=$( echo $text $len|awk '<awk-script>')쉘에 의해 해석되고 {print substr($0,0,$2)}실제 awk스크립트일 뿐입니다.

man awk이제 awk() 맨페이지를 살펴보겠습니다 .

awk 유틸리티는 레코드의 첫 번째 필드 $1, 두 번째 필드 $2등을 나타내야 합니다. 이 기호는 $0전체 기록을 나타냅니다 [...].

그리고

substr(s, m[, n ])
위치에서 시작하여 번호가 매겨진 최대 2자의 n하위 문자열을 반환합니다. 생략되거나 문자열에 남아 있는 것보다 더 많은 문자가 지정된 경우 하위 문자열의 길이는 문자열의 길이로 제한됩니다.sm1nns

따라서 우선 길이 매개변수의 숫자 substr도 로 시작하므로 대신 1사용하는 것이 더 좋다는 점 에 유의하세요 .substr($0,1,$2)substr($0,0,$2)

$text따라서 (예에서) 파이프하는 첫 번째 청크 awk는 문자열이고 두 번째 "청크"( $len예에서)는 문자 수를 설명하는 정수여야 합니다.모든 블록을 함께, 반환하려는 첫 번째 문자부터 시작합니다.

좋습니다. 이제 다음을 시도해 보세요.

echo ABCDEFGHIJKLMNOPQRSTUVWXYZ 2 | awk '{print substr($0,1)}'

주어진

ABCDEFGHIJKLMNOPQRSTUVWXYZ 2

지금 바로가득한입력하다.

echo ABCDEFGHIJKLMNOPQRSTUVWXYZ 2 | awk '{print substr($1,1)}'

주어진

ABCDEFGHIJKLMNOPQRSTUVWXYZ

즉, 완전한 첫 번째 블록입니다.

그래서

echo ABCDEFGHIJKLMNOPQRSTUVWXYZ "${len}" | awk '{print substr($0,1,$2)}'

제공될 첫 번째 $len문자 ABCDEFGHIJKLMNOPQRSTUVWXYZ "$len"는 텍스트 자체입니다.그리고이것 $len.

$len가지고 있는 첫 번째 문자 만 원하는 경우 $text다음을 시도해 보세요.

val=$( echo $text $len|awk '{print substr($1,1,$2)}')

즉, awk 스크립트에서는 $0.$1

또한 큰따옴표를 사용하여 쉘 인수를 "이스케이프"하는 것을 고려하십시오.

val="$(echo "$text" "$len" | awk '{print substr($1,1,$2)}')"

일반적으로 그것이 사람들이 원하는 것입니다(적어도 $([...])전체 내용과 주위에 인용문은 건너뛸 수 있으므로) $text.$len

관련 정보