수색…
명령 줄 변수 할당
명령 줄에서 변수를 할당하려면 -v 사용할 수 있습니다.
$ awk -v myvar="hello" 'BEGIN {print myvar}'
hello
등호 주변에는 공백이 없어야합니다.
이렇게하면 쉘 변수를 사용할 수 있습니다.
$ shell_var="hello"
$ awk -v myvar="$shell_var" 'BEGIN {print myvar}'
hello
또한 awk 를 제어하는 내장 변수를 설정할 수 있습니다.
FS (필드 구분 기호) 예제를 참조하십시오.
$ cat file
1,2;3,4
$ awk -v FS="," '{print $2}' file
2;3
$ awk -v FS=";" '{print $2}' file
3,4
또는 OFS (출력 필드 구분 기호)를 사용합니다.
$ echo "2 3" | awk -v OFS="--" '{print $1, $2}'
2--3
$ echo "2 3" | awk -v OFS="+" '{print $1, $2}'
2+3
-v 옵션을 사용하여 매개 변수를 프로그램에 전달
옵션 -v 다음에 variable = value 형식의 지정이 뒤따라 awk 프로그램에 매개 변수를 전달할 수 있습니다. 이것은 아래의 처벌 프로그램에 의해 설명됩니다.이 직업은 표준 출력에서 "나는 수업에서 말하지 않을 것"이라는 문장의 횟수를 세는 것 입니다. 다음 예제는 교사들에게 매우 인기있는 값 100을 사용합니다.
awk -v count=100 'BEGIN {
for(i = 1; i <= count; ++i) {
print("I shall not talk in class.")
}
exit
}'
-v 플래그를 반복적으로 사용하여 여러 매개 변수를 전달할 수 있습니다.
awk -v count=100 -v "sentence=I shall not talk in class." 'BEGIN {
for(i = 1; i <= count; ++i) {
print(sentence)
}
exit
}'
배열 또는 목록 매개 변수에 대한 기본 제공 지원은 없으며 이러한 매개 변수는 수동으로 처리해야합니다. 목록 매개 변수를 전달하는 고전적인 방법은 구분 기호를 사용하여 목록을 연결하는, 대중적인 선택은 : , | 또는 , . split 함수는리스트를 awk 배열로 복구합니다 :
awk -v 'serialised_list=a:b:c:d:e:f' 'BEGIN {
list_sz = split(serialised_list, list, ":")
for(i = 1; i <= list_sz; ++i) {
printf("list: %d: %s\n", i, list[i])
}
exit
}'
이 awk 프로그램의 출력은 다음과 같습니다.
list: 1: a
list: 2: b
list: 3: c
list: 4: d
list: 5: e
list: 6: f
가끔 awk 배열의 키로 목록 항목을 복구하는 것이 더 편리합니다. 이는 쉬운 멤버 확인을 허용하기 때문입니다. 예를 들어, 다음 프로그램은 첫 번째 단어가 예외의 고정 된 목록에 속하지 않는 각 행을 인쇄합니다.
awk -v 'serialised_exception_list=apple:pear:cherry' 'BEGIN {
_list_sz = split(serialised_exception_list, _list, ":")
for(i = 1; i <= _list_sz; ++i) {
exception[_list[i]]
}
}
! ($1 in exception) { print }' <<EOF
apple Apples are yummy, I like them.
pineapple Do you like pineapple?
EOF
이 프로그램의 출력은 다음과 같습니다.
pineapple Do you like pineapple?
마지막 예제로, 쉘 스크립트가 보조 awk 스크립트에 매개 변수를 전달하는 방법을 보여주기 때문에 쉘 스크립트에 처벌 프로그램을 래핑하는 방법을 보여줍니다.
#!/bin/sh
usage()
{
cat <<EOF
Usage: punishment [-c COUNT][-s SENTENCE]
Prepare your punishments for you
EOF
}
punishment_count='100'
punishment_sentence='I shall not talk in class.'
while getopts "c:hs:" OPTION; do
case "${OPTION}" in
c) punishment_count="${OPTARG}";;
s) punishment_sentence="${OPTARG}";;
h) usage; exit 0;;
*) usage; exit 64;;
esac
done
awk -v "count=${punishment_count}" -v "sentence=${punishment_sentence}" 'BEGIN {
for(i = 1; i <= count; ++i) {
print(sentence)
}
exit
}'
지역 변수
awk 언어는 함수의 지역 변수를 직접 지원하지 않습니다. 그러나 함수에 추가 인수를 추가하여 쉽게 에뮬레이트 할 수 있습니다. 이러한 변수 앞에 _ 을 붙이면 실제 매개 변수가 아님을 나타냅니다.
문자열 주위에 작은 따옴표를 추가하는 single_quote 함수의 정의로이 기술을 설명합니다.
# single_quote(TEXT)
# Return a string made of TEXT surrounded by single quotes
function single_quote(text, _quote) {
_quote = sprintf("%c", 39)
return sprintf("%s%s%s", _quote, text, _quote);
}
sprintf("'%s'", text) 를 사용하는 더 간단한 방법은 awk 스크립트가 일반적으로 작은 따옴표로 묶인 인수로 awk 프로그램에 전달되기 때문에 실제적인 문제를 야기합니다.
배정 인수
할당 인수는 파일 변수와 동일한 영역에서 awk 호출의 끝에 나타납니다. -v 지정과 인수 할당은 다음 정규 표현식과 일치해야합니다. (POSIX 로켈 가정)
^[[:alpha:]_][[:alnum:]_]*=
다음 예제에서는 다음을 포함하는 파일 file 을 가정합니다. 1 2 3 (공백으로 구분)
$ awk '{$1=$1}1' file OFS=, file OFS=- file
1 2 3
1,2,3
1-2-3