주문하다: 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
계산이 시작되기 때문입니다 . 첫 번째 블록은 이고 , 두 번째 블록은 입니다 . 실제로 파이프로 연결하는 전체 라인 , 모든 청크를 함께 사용합니다.1
0
$1
$2
$0
awk
자세한 세부 사항:
좋아, 먼저 나는 이 일을 쉘에서 실행하고 있다고 가정합니다. 예를 들어 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
하위 문자열을 반환합니다. 생략되거나 문자열에 남아 있는 것보다 더 많은 문자가 지정된 경우 하위 문자열의 길이는 문자열의 길이로 제한됩니다.s
m
1
n
n
s
따라서 우선 길이 매개변수의 숫자 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