독립형 awk 스크립트 파일을 작성하는 방법을 알아내려고 노력 중입니다.
독립형 bash 스크립트 파일과 비슷하다고 생각합니다.
#! /usr/bin/awk -f
BEGIN{
for (i = 0; i < ARGC; i++)
printf "%s ", ARGV[i]
printf "\n"
}
{print $0}
셸에서 명령줄 인수를 지정하고 이를 스크립트에 전달하는 방법을 알아내려고 합니다.
$ myscript.awk arg1 arg2 arg3 awk arg1 arg2 arg3 awk: /home/tim/myscript.awk:5: fatal: cannot open file `arg1' for reading (No such file or directory)
awk 스크립트에는 어떤 명령줄 인수가 필요합니까?
arg1
입력 파일이 될 것으로 예상되는 이유는 무엇입니까 ?명령줄 인수는 awk 스크립트에 전달되어 ARGV 배열에 저장됩니다. 내 업데이트를 참조하세요. 그래서 명령줄 인수는
awk
.-f
shebang을 제거하면 , 즉#! /usr/bin/awk
$ myscript.awk arg1 arg2 arg3 awk: cmd. line:1: /home/tim/myscript.awk awk: cmd. line:1: ^ syntax error
왜
-f
필요한가요?
감사해요.
답변1
AWK는 인수가 스크립트의 텍스트이거나 -f
실행될 스크립트가 포함된 파일 이름이 뒤에 올 것으로 예상합니다. 두 경우 모두 선택적으로 처리할 파일 이름이 뒤에 올 것입니다.
이것이 shebang 줄이 필요한 이유를 설명합니다 -f
. 이 줄이 없으면 AWK는 스크립트의 파일 이름 자체가 실행될 AWK 문이라고 생각할 것입니다.
매개변수 처리와 관련하여 AWK 프로그램은 필요에 따라 자체 매개변수 처리를 수행할 수 있습니다. 다음 줄로 인해 스크립트가 {print $0}
실패합니다. 이는 인터프리터가 입력(일부 지정했기 때문에 명령줄에 이름이 지정된 파일)에서 각 줄을 읽고 블록의 지침에 따라 처리하도록 지시합니다. 해당 줄을 제거하면 오류가 발생하지 않습니다. 매개변수를 처리 하고 입력 파일만 포함하도록 BEGIN
삭제하면 AWK가 불평하지 않습니다.ARGV
자신만의 매개변수와 입력 처리를 시도한다는 것은 AWK를 매우 유용하게 만드는 많은 것들을 무시한다는 것을 의미할 수 있습니다. 그렇게 하고 싶다면 Perl을 사용하는 것이 좋습니다.
(shebang 처리는 간단한 AWK 스크립트를 파일 이름에 저장할 수 있다는 것을 의미하므로 스크립트에 대한 영리한 이름을 찾을 필요가 없습니다. 누구도 그렇게 해서는 안 됩니다...)
답변2
awk 스크립트에는 어떤 명령줄 인수가 필요합니까? 왜 arg1을 입력 파일로 예상합니까?
awk
패턴 기반 규칙에는 입력이 필요합니다. 프로그램의 이 부분에 대한 처리가 시작되면 awk
인수가 파일 이름으로 사용됩니다(파일 이름이 지정되지 않으면 표준 입력이 사용됩니다).
이 단계 전에 블록에 제공된 매개변수를 사용하여 모든 작업을 수행할 수 있습니다 BEGIN
.
다음과 같은 작은 예가 여러분의 시작에 도움이 될 것이라고 생각합니다.
$ cat a.awk
#!/usr/bin/awk -f
BEGIN {
i=1
while( i in ARGV )
print ARGV[i++]
}
a.awk
블록 은 하나만 있고 BEGIN
패턴 기반 규칙은 없습니다. awk
파일이 필요하지 않으므로 주어진 인수는 파일 이름으로 사용되지 않습니다.
$ ./a.awk poit --zort -troz narf
poit
--zort
-troz
narf
이것으로 무엇을 하느냐는 당신의 결정입니다.
패턴 기반 규칙을 통해 매개변수로 제공된 파일을 처리하려면 블록에 사용된 모든 매개변수를 제거해야 합니다 BEGIN
.
$ cat b.awk
#!/usr/bin/awk -f
BEGIN {
if( ARGV[1] == "--tolower" ) { cmd = "tr A-Z a-z" ; delete ARGV[1] }
else if( ARGV[1] == "--toupper" ) { cmd = "tr a-z A-Z" ; delete ARGV[1] }
else cmd = "cat"
}
{
print | cmd
}
옵션 없이 예제를 실행합니다.
$ ./b.awk a.awk
#!/usr/bin/awk -f
BEGIN {
i=1
while( i in ARGV )
print ARGV[i++]
}
옵션을 사용하여 예제를 실행합니다 --toupper
.
$ ./b.awk --toupper a.awk
#!/USR/BIN/AWK -F
BEGIN {
I=1
WHILE( I IN ARGV )
PRINT ARGV[I++]
}
답변3
스크립트는 awk
옵션이 아닌 명령줄 인수가 스크립트가 작동해야 하는 파일의 파일 이름일 것으로 예상합니다(아무 것도 지정되지 않으면 표준 입력으로 작동합니다).
따라서 스크립트 파일 #!/usr/bin/awk -f
에서 이를 사용하면 awk
파일 자체의 텍스트가 에 전달되어야 함을 시스템에 알립니다 awk -f
. 다른 명령줄 인수는 입력 파일이나 추가 플래그로 해석됩니다 awk
.
#!/usr/bin/awk -f
BEGIN {
for (i in ARGV) {
printf("ARGV[%d] = %s\n", i, ARGV[i]);
}
printf("var = %s\n", var);
}
$ ./script.awk -vvar=hello ~/.profile
ARGV[0] = awk
ARGV[1] = /home/kk/.profile
var = hello
옵션에 대한 명령줄 검사는 옵션이 아닌 첫 번째 인수에서 끝납니다.
$ ./script.awk ~/.profile -vvar=hello
ARGV[2] = -vvar=hello
ARGV[0] = awk
ARGV[1] = /home/kk/.profile
var =
무엇이든 유용하게 사용 하려면 awk
입력 데이터가 필요합니다. 이 데이터는 일반적으로 명령줄에 명명된 하나 이상의 입력 파일이나 표준 입력 스트림에서 전송된 데이터에서 가져옵니다.
BEGIN
AND 블록을 제외하고 END
스크립트의 각 블록은 awk
입력 데이터의 각 레코드에 차례로 적용됩니다(기본값은 각 행).