awk가 무엇인가요?
UNIX는 익숙하지만 awk는 익숙하지 않을 수도 있습니다. 사실 awk는 뛰어난 기능에 비해 전혀 놀라운 일이 아닙니다. 인기 좀. awk는 무엇입니까? 대부분의 다른 UNIX 명령과 달리 awk의 기능은 이름만으로는 알 수 없습니다. 이는 독립적인 의미를 갖는 영어 단어도 아니고 여러 관련 단어의 약어도 아닙니다. 사실 awk는 Aho, (Peter) Weinberg, (Brain) Kernighan 세 사람의 이름을 합친 약어입니다. 탁월한 스타일의 스캐닝 및 처리 도구인 awk를 만든 사람은 바로 이 세 사람이었습니다.
AWK의 기능은 무엇인가요? sed 및 grep과 마찬가지로 awk는 패턴 검색 및 처리 도구입니다. 그러나 그 기능은 sed 및 grep보다 훨씬 강력합니다. Awk는 매우 강력한 기능을 제공합니다. grep 및 sed가 수행할 수 있는 거의 모든 작업을 완료하는 동시에 스타일 로딩, 흐름 제어, 수학 연산자, 프로세스 제어 문, 심지어 내장 변수 및 함수까지 수행할 수 있습니다. . 완전한 언어가 가져야 할 아름다운 기능을 거의 모두 갖추고 있습니다. 실제로 awk에는 awk 프로그래밍 언어라는 자체 언어가 있습니다. awk의 세 제작자는 공식적으로 이를 스타일 검색 및 처리 언어로 정의했습니다.
왜 awk를 사용하나요?
그래도 왜 awk를 사용해야 할까요?
awk를 사용하는 첫 번째 이유는 텍스트 기반 스타일 스캐닝과 처리입니다. awk가 수행하는 작업은 데이터베이스와 다소 비슷하지만, 텍스트 파일을 처리하는 데 특별한 저장 형식이 없으며 일반 사람들이 편집하고 읽고 이해할 수 있습니다. 처리하십시오. 데이터베이스 파일에는 특별한 저장 형식이 있는 경우가 많으므로 이를 처리하려면 데이터베이스 처리 프로그램을 사용해야 합니다. 이런 종류의 데이터베이스 같은 처리 작업을 자주 접하게 되므로 이를 처리하는 간단하고 쉬운 방법을 찾아야 합니다. UNIX에는 sed, grep, sort, find 등과 같은 이 영역에 대한 많은 도구가 있으며 그 중 awk가 있습니다. 매우 훌륭한 것입니다.
awk를 사용하는 두 번째 이유는 awk가 강력한 기능에 비해 간단한 도구이기 때문입니다. 실제로 UNIX에는 뛰어난 도구가 많이 있습니다. 예를 들어 UNIX의 기본 개발 도구인 C 언어와 그 후속인 C++는 매우 뛰어납니다. 하지만 그에 비해 awk는 동일한 기능을 수행하는 데 훨씬 더 편리하고 간단합니다. 이는 우선 awk가 간단한 문제를 해결하기 위한 awk 명령줄부터 복잡하고 정교한 awk 프로그래밍 언어에 이르기까지 다양한 요구 사항을 충족하는 솔루션을 제공하기 때문입니다. 이것의 장점은 해결하기 위해 복잡한 방법을 사용할 필요가 없다는 것입니다. 그렇지 않으면 매우 복잡한 문제입니다. 예를 들어, 간단한 문제를 해결하기 위해 명령줄을 사용할 수 있지만 C는 그렇지 않습니다. 간단한 프로그램이라도 C 언어는 작성과 컴파일의 전 과정을 거쳐야 합니다. 둘째, awk 자체가 해석되고 실행되므로 awk 프로그램은 컴파일 과정을 거칠 필요가 없으며 동시에 쉘 스크립트 프로그램과도 잘 맞습니다. 마지막으로 awk 자체는 C 언어보다 간단합니다. awk는 C 언어의 우수한 요소를 많이 흡수하지만 C 언어에 익숙해지면 awk 학습에 큰 도움이 되지만 awk 자체는 C 언어를 사용할 필요가 없습니다. 강력하지만 익히는 데 많은 시간이 걸리는 필수 개발 도구입니다.
awk를 사용하는 세 번째 이유는 awk가 쉽게 사용할 수 있는 도구이기 때문입니다. C 및 C++ 언어와 달리 awk에는 하나의 파일(/bin/awk)만 있으며 거의 모든 UNIX 버전은 자체 버전의 awk를 제공합니다. 하지만 C 언어는 그렇지 않습니다. C 언어는 UNIX에 대한 자연스러운 개발 도구이지만 이 개발 도구는 별도로 출시됩니다. 즉, C 언어 개발 도구의 UNIX 버전에 대해 별도로 비용을 지불해야 합니다. 물론 D 버전을 사용하시는 분들은)) 먼저 구해서 설치하신 후 사용하세요.
위의 이유와 awk의 강력한 기능을 바탕으로 텍스트 스타일 스캐닝과 관련된 작업을 처리하려면 awk를 가장 먼저 선택해야 한다고 말할 이유가 있습니다. 여기서 따라야 할 일반적인 원칙이 있습니다: 일반 쉘 도구나 쉘 스크립트를 사용하는 데 어려움이 있으면 awk를 시도하고, awk가 여전히 문제를 해결할 수 없으면 C 언어를 사용하고, C++로 이동합니다.
awk 호출 방법
앞서 언급했듯이 awk는 다양한 요구 사항을 충족하기 위해 다양한 솔루션을 제공합니다.
awk 명령줄을 사용하면 일반처럼 사용할 수 있습니다. UNIX 명령은 명령줄에서 awk 프로그래밍 언어를 사용할 수도 있습니다. awk는 여러 줄 입력을 지원하지만 긴 명령줄을 입력하고 올바른지 확인하는 것은 골치 아픈 작업입니다. 간단한 문제를 해결하세요. 물론 awk 명령줄을 참조하거나 쉘 스크립트 프로그램의 awk 프로그램 스크립트를 참조할 수도 있습니다.
2. -f 옵션을 사용하여 awk 프로그램을 호출합니다. Awk를 사용하면 awk 프로그램을 텍스트 파일에 작성한 다음 awk 명령줄에서 -f 옵션을 사용하여 이 프로그램을 호출하고 실행할 수 있습니다. 구체적인 방법은 나중에 awk 구문에서 논의됩니다.
3. 명령 해석기를 사용하여 awk 프로그램 호출: UNIX에서 지원하는 명령 해석기 기능을 사용하여 awk 프로그램을 텍스트 파일에 작성한 다음 첫 번째 줄에
을 추가할 수 있습니다.#!/bin/awk -f
그리고 이 텍스트 파일 실행 권한을 부여해 주세요. 이 작업을 수행한 후 다음과 유사한 방식으로 명령줄에서 이 awk 프로그램을 호출하고 실행할 수 있습니다.
처리할 $awk 스크립트 텍스트 이름 파일
Awk 구문:
다른 UNIX 명령과 마찬가지로 awk에도 고유한 구문이 있습니다.
awk [ - F re] [매개변수...] ['prog'] [-f progfile][in_file...]
매개변수 설명:
-F re: awk가 해당 필드를 변경할 수 있도록 허용 분리 기호.
매개변수: 이 매개변수는 다양한 변수에 값을 할당하는 데 도움이 됩니다.
'prog': awk 프로그램 명령문 세그먼트입니다. 이 명령문 세그먼트는 쉘에서 해석되지 않도록 단일 확장 기호 ' 및 '로 묶어야 합니다. 이 프로그램 명령문 세그먼트의 표준 형식은 다음과 같습니다.
'pattern {action}'
패턴 매개변수는 egrep 정규식 중 하나일 수 있으며 / 구문을 사용하여 추가할 수 있습니다. re/ 몇 가지 스타일 매칭 기술로 구성됩니다. sed와 마찬가지로 ","를 사용하여 두 스타일을 구분하여 범위를 선택할 수도 있습니다. 매칭에 대한 자세한 내용은 부록을 참고하세요. 그래도 이해가 안 되시면 UNIX 책을 찾아 grep, sed를 배워보세요. (저는 ed를 공부할 때 매칭 기술을 마스터했습니다.) 작업 매개변수는 항상 중괄호로 둘러싸여 있으며 ";"로 구분된 시스템 awk 문으로 구성됩니다. awk는 이를 해석하고 패턴에 지정된 패턴과 일치하는 레코드에 대해 작업을 수행합니다. 쉘과 유사하게 "#"을 주석 문자로 사용할 수도 있습니다. 이는 "#"부터 줄 끝까지의 내용을 주석으로 만들고 해석 및 실행 시 무시됩니다. 패턴이나 작업 중 하나를 생략할 수 있지만 동시에 둘 다 생략할 수는 없습니다. 패턴을 생략하면 패턴 일치가 없으므로 작업이 생략되면 기본 작업이 수행됩니다. 수행됨 - 표준 출력에 표시됩니다.
-f progfile: awk가 progfile에 지정된 프로그램 파일을 호출하고 실행할 수 있도록 합니다. progfile은 텍스트 파일이며 awk의 구문을 준수해야 합니다.
in_file: awk 입력 파일, awk를 사용하면 여러 입력 파일을 처리할 수 있습니다. awk가 입력 파일을 수정하지 않는다는 점은 주목할 가치가 있습니다. 입력 파일이 지정되지 않으면 awk는 표준 입력을 받아들이고 결과를 표준 출력에 표시합니다. awk는 입력 및 출력 리디렉션을 지원합니다.
Awk의 레코드, 필드 및 내장 변수:
앞서 언급한 것처럼 awk의 처리 작업은 데이터베이스의 처리 방법과 유사점 중 하나는 awk가 처리를 지원한다는 것입니다. grep과 sed로는 달성할 수 없는 레코드 및 필드 처리 기능이 awk가 둘보다 나은 이유 중 하나입니다. awk에서는 기본적으로 텍스트 파일의 한 줄은 항상 레코드로 간주되고, 줄의 특정 부분은 레코드의 필드로 처리됩니다. 이러한 다양한 필드를 작동하기 위해 awk는 쉘의 방법을 빌려 $1, $2, $3...를 사용하여 행(레코드)의 다양한 필드를 순차적으로 나타냅니다. 특히 awk는 $0을 사용하여 전체 행(레코드)을 나타냅니다. 다양한 필드는 구분 기호라는 문자로 구분됩니다. 시스템 기본 구분 기호는 공백입니다. Awk를 사용하면 명령줄에서 -F re 형식을 사용하여 이 구분 기호를 변경할 수 있습니다. 실제로 awk는 내장 변수 FS를 사용하여 이 구분 기호를 기억합니다. awk에는 이러한 내장 변수가 여러 개 있습니다(예: 레코드 구분 변수 RS, 현재 NR로 작동하는 레코드 수 등). 이 기사 끝에 있는 부록에는 모든 내장 변수가 나열되어 있습니다. 이러한 내장 변수는 awk 프로그램에서 참조하거나 수정할 수 있습니다. 예를 들어 NR 변수를 사용하여 패턴 일치의 작업 범위를 지정하거나 레코드 구분 기호 RS를 수정하여 개행 문자 대신 특수 문자를 사용할 수 있습니다. 레코드 구분 기호로 문자를 사용합니다.
예: 텍스트 파일 myfile의 7번째 줄부터 15번째 줄까지 문자 %로 구분된 첫 번째 필드, 세 번째 필드 및 일곱 번째 필드를 표시합니다.
awk -F % ' NR ==7,NR==15 {printf $1 $3 $7}'
Awk의 내장 함수
awk가 훌륭한 프로그래밍 언어가 되는 이유 중 하나는 C와 같은 우수한 프로그래밍 언어의 많은 장점. 이러한 장점 중 하나는 내장 함수를 사용한다는 것입니다. 이러한 함수를 사용하면 awk에서 제공하는 함수가 더 완벽해지고 강력해집니다. 일련의 내장 문자열 처리 함수(이러한 함수는 C 언어의 문자열 처리 함수와 유사하며 사용법도 C 언어의 함수와 유사합니다.) awk의 문자열 처리 기능이 더 강력한 기능입니다. 이 글의 끝 부분에 있는 부록에는 일반 awk에서 제공하는 내장 함수가 나열되어 있습니다. 이러한 내장 함수는 사용 중인 awk 버전과 다소 다를 수 있으므로 사용하기 전에 온라인 도움말을 참조하는 것이 가장 좋습니다. 당신의 시스템.
내장 함수의 예로 awk의 출력을 C 언어와 일치하게 만드는 awk의 printf 함수를 여기서 소개하겠습니다. 실제로 awk의 많은 참조 양식은 C 언어에서 차용되었습니다. C 언어에 익숙하다면 printf 기능이 제공하는 강력한 형식 출력 기능이 우리에게 많은 편리함을 가져다 주었음을 기억할 것입니다. 다행히 awk에서 다시 만났어요. awk의 Printf는 C 언어와 거의 동일합니다. C 언어에 익숙하다면 C 언어의 패턴에 따라 awk에서 printf를 사용할 수 있습니다. 따라서 여기에서는 단지 예만 제시합니다. 아직 익숙하지 않다면 C 언어 입문서를 찾아 읽어보시기 바랍니다.
예: myfile 파일의 줄 번호와 필드 3을 표시합니다.
$awk '{printf"%03d%s",NR,$1}' myfile
명령줄에서 awk 사용
순서적으로 awk 프로그래밍의 내용을 설명해야 하는데, 설명하기 전에 몇 가지 예제를 사용하여 이전 지식을 복습하겠습니다. 이 예제는 모두 명령줄에서 사용됩니다. 이를 통해 명령줄에서 awk를 사용하는 것이 얼마나 편리한지 알 수 있습니다. 그 이유는 한편으로는 다음 내용을 위한 길을 닦고 다른 한편으로는 간단한 문제를 해결하기 위한 몇 가지 방법을 소개하기 위한 것입니다. awk는 간단한 문제를 해결하기 위해 복잡한 방법을 사용할 필요가 없습니다. 방법면에서는 비교적 간단합니다.
예: 문자열 "sun"과 일치(포함)하는 텍스트 파일 mydoc의 모든 행을 표시합니다.
$awk '/sun/{print}' mydoc
전체 레코드(전체 라인)를 표시하는 것이 awk의 기본 액션이므로 액션 항목을 생략할 수 있습니다.
$awk '/sun/' mydoc
예: 다음은 더 복잡한 일치 예입니다.
$awk '/[Ss]un/,/[ Mm ]oon/ {print}' myfile
Sun 또는 sun과 일치하는 첫 번째 줄과 Moon 또는 Moon과 일치하는 첫 번째 줄 사이의 줄을 표준 출력에 표시합니다.
예: 다음 예에서는 내장 변수와 내장 함수 length()를 사용하는 방법을 보여줍니다.
$awk 'length($0)>80 {print NR}' myfile
이 명령줄은 80자를 초과하는 텍스트 myfile의 모든 줄 번호를 표시합니다. 여기서 $0은 전체 레코드(줄)를 나타내는 데 사용됩니다. 동시에 내장 변수 NR은 표시하지 않습니다. 식별자 '$'를 사용하세요.
예: 좀 더 실용적인 예로, /etc 아래의 passwd 파일을 검사하고 passwd 필드(두 번째 필드)가 "*"인지 확인하여 UNIX 사용자에 대한 보안 검사를 수행한다고 가정합니다. "*"가 아니면 사용자가 비밀번호를 설정하지 않았음을 의미하며 이러한 사용자 이름이 표시됩니다(첫 번째 필드). 다음 명령문을 사용하여 달성할 수 있습니다.
#awk -F: '$2=="" {printf("%s no passwd!",$1' /etc/passwd
In 이 예에서는 passwd 파일의 필드 구분 기호가 ":"이므로 기본 필드 구분 기호를 변경하려면 -F:를 사용해야 합니다. 이 예에는 내장 함수 printf
awk도 사용됩니다. 변수 <.>
다른 프로그래밍 언어와 마찬가지로 awk에서는 프로그래밍 언어에서 변수를 설정할 수 있습니다. 실제로 변수의 기능을 제공하는 것은 프로그래밍 언어의 필수 요구 사항입니다.
Awk는 두 가지 유형의 변수를 제공합니다. 하나는 앞서 언급한 다른 변수와는 다릅니다. awk 프로그램에서 참조되는 내장 변수는 식별자 "$"를 사용할 필요가 없습니다. awk가 제공하는 또 다른 유형의 변수는 사용자 정의 변수입니다. awk 프로그램 문에서는 자체 변수입니다. 이러한 종류의 변수는 내장 변수 및 기타 awk 예약어와 동일할 수 없습니다. awk에서 사용자 정의 변수를 참조할 때는 앞에 식별자 "$"를 추가해야 합니다. C 언어인 awk는 변수를 초기화할 필요가 없습니다. awk의 첫 번째 모양을 기반으로 특정 데이터 유형을 결정합니다. 변수 유형이 확실하지 않은 경우 awk는 기본적으로 문자열 유형을 사용합니다. 사용된 변수의 명확한 유형을 알아보려면 프로그램에서 초기 값을 할당해야 합니다. 다음 예에서는 이 기술을 사용합니다.
프로그래밍 언어의 특성 중 하나입니다. , awk는 C 언어에서 제공하는 것과 동일한 +, -, *, /, % 등과 같은 다양한 작업을 지원합니다. 동시에 awk는 ++, --와 같은 C 함수도 지원합니다. , +=, -=, =+, =- 언어에서는 awk 프로그램을 작성할 때 C 언어에 익숙한 사용자에게 큰 편의를 제공합니다. 확장으로 awk는 일련의 내장 작업 기능(예: 로그)도 제공합니다. , sqr, cos, sin 등) 및 문자열에 대한 연산(연산)을 위한 일부 함수(예: length, substr 등)를 참조하면 awk
의 컴퓨팅 기능이 크게 향상됩니다.조건부 전달 명령의 일부로 관계 판단은 모든 프로그래밍 언어가 갖는 기능이며 awk도 예외는 아닙니다. awk에서는 일반적으로 사용되는 ==(같음)과 같은 다양한 테스트가 허용됩니다! =(같지 않음), >(보다 큼), =(크거나 같음), >=(보다 작거나 같음) 등 스타일 매칭으로~(매치인)도 제공되고! ~ (일치하지 않음) 판단.
awk는 테스트의 확장으로!(not), &&(and), ||(or) 및 대괄호()를 사용한 여러 판단도 지원하므로 awk 기능이 크게 향상됩니다. 이 기사의 부록에는 awk에서 허용하는 작업, 판단 및 연산자 우선 순위가 나열되어 있습니다.
Awk의 흐름 제어
흐름 제어 문은 모든 프로그래밍 언어에서 없어서는 안 될 부분입니다. 좋은 언어에는 흐름 제어를 수행하는 몇 가지 명령문이 있습니다. awk가 제공하는 완전한 흐름 제어 명령문은 C 언어와 유사하므로 프로그래밍이 매우 편리합니다.
1. BEGIN 및 END:
awk에는 BEGIN과 END라는 두 가지 특수 표현식이 있으며, 둘 다 패턴에서 사용할 수 있으며(이전 awk 구문 참조) BEGIN을 제공합니다. END의 기능은 프로그램에 초기 상태를 제공하고 프로그램이 끝난 후 일부 마무리 작업을 수행하는 것입니다. BEGIN({} 내) 뒤에 나열된 모든 작업은 awk가 입력 스캔을 시작하기 전에 실행되는 반면, END 뒤에 나열된 작업은 모든 입력이 스캔된 후에 실행됩니다. 따라서 일반적으로 BEGIN은 변수 및 미리 설정된(초기화된) 변수를 표시하는 데 사용되며 END는 최종 결과를 출력하는 데 사용됩니다.
예: 판매 파일 xs의 누적 판매 금액(판매 금액이 레코드의 세 번째 필드에 있다고 가정):
$awk
>'BEGIN { FS=": "; print "통계 판매 금액";total=0}
>{print $3;total=total+$3;}
>END {printf "총 판매 금액: %.2f",total}' sx
(참고: >는 쉘이 제공하는 두 번째 프롬프트입니다. 쉘 프로그램 awk 문 및 awk 언어에서 줄을 바꾸려면 줄 끝에 백슬래시를 추가해야 합니다.)
여기서 BEGIN이 미리 설정되어 있습니다. 내부 변수 FS(필드 구분자)와 사용자 정의 변수 total이 추가되고, 스캔하기 전에 출력 라인 헤더가 표시됩니다. 그리고 END는 스캔이 완료된 후 합계를 인쇄합니다.
2. 프로세스 제어문
awk는 완전한 프로세스 제어문을 제공하며 사용법은 C 언어와 유사합니다. 아래에서 하나씩 설명하겠습니다:
2.1, if...else 문:
형식:
if (표현식)
문 1
else
문 2
형식의 "문 1"은 여러 문이 될 수 있습니다. awk의 판단과 읽기를 용이하게 하려면 여러 문을 {}로 묶는 것이 좋습니다. awk 분기 구조는 중첩을 허용하며 해당 형식은 다음과 같습니다.
if (표현식 1)
{if (표현식 2)
문장 1
else
문장 2
}
문 3
else {if (표현식 3)
문 4
else
문 5
}
문 6
물론 실제 연산은 프로세스에서 그렇게 복잡한 분기 구조를 사용하지 않을 수도 있습니다. 이는 단지 스타일을 부여하기 위한 것입니다.
2.2. while 문
형식은
while(표현식)
문
2.3. >형식은
do
{
문
}while(조건판단문)
2.4, for문
형식은 다음과 같습니다.
for (초기식; 종료 조건; 단계 식)
{statement}
break 및 continue 문은 while, do-while 및 for awk 제어문에서 허용됩니다. 프로세스의 흐름을 제어하고 종료와 같은 명령문을 사용할 수도 있습니다. break는 현재 실행 중인 루프를 중단하고 루프 밖으로 점프하여 다음 문을 실행합니다. 계속 실행을 위해 현재 위치에서 루프의 시작 부분으로 점프합니다. Exit 실행에는 두 가지 상황이 있습니다. Exit 문이 END에 있지 않으면 모든 작업의 종료 명령이 파일 끝에 도달한 것처럼 동작하고 모든 모드 또는 작업 실행이 중지되며 END에 있는 작업이 종료됩니다. 모드가 실행됩니다. END에 종료가 나타나면 프로그램이 종료됩니다.
예:
awk의 사용자 정의 함수
사용자 고유의 함수를 정의하고 호출하는 것은 거의 모든 고급 언어의 기능이며 awk도 예외는 아닙니다. 원래 awk는 함수 기능을 제공하지 않으며 함수는 nawk 또는 최신 awk 버전에만 추가할 수 있습니다.
함수 사용은 함수 정의와 함수 호출의 두 부분으로 구성됩니다. 함수 정의에는 실행될 코드(함수 자체)와 기본 프로그램 코드에서 함수에 전달된 임시 호출이 포함됩니다.
awk 함수는 다음과 같이 정의됩니다.
함수 함수 이름(매개변수 목록) {
함수 본문
}
gawk에서는 func에 대한 기능을 생략할 수 있지만 다른 버전의 awk에서는 이를 허용하지 않습니다. 함수 이름은 합법적인 식별자여야 합니다. 매개변수 목록에는 매개변수가 제공될 수 없습니다(그러나 함수를 호출할 때 함수 이름 뒤의 한 쌍의 괄호는 여전히 필수입니다). 또는 하나 이상의 매개변수가 제공될 수 있습니다. C 언어와 마찬가지로 awk 매개변수도 값으로 전달됩니다.
awk에서 함수를 호출하는 방법은 C 언어와 비슷하지만 awk는 C 언어보다 더 유연합니다. 즉, 함수를 호출할 때 함수가 예상하는 것보다 더 많거나 적은 매개변수를 나열할 수 있습니다(함수 정의에 지정됨). 추가 매개변수는 awk에 의해 무시되고, 부족한 매개변수는 awk에 의해 기본값으로 설정됩니다. 매개변수 사용 방법에 따라 값 0 또는 빈 문자열입니다.
awk 함수에는 암시적 반환과 명시적 반환이라는 두 가지 반환 방법이 있습니다. awk가 함수 끝까지 실행되면 호출 프로그램으로 자동으로 반환되므로 함수가 암시적으로 반환됩니다. 함수가 끝나기 전에 종료해야 하는 경우 명시적으로 return 문을 사용하여 일찍 종료할 수 있습니다. 방법은 함수에서 반환값을 반환하는 형식의 문장을 사용하는 것이다.
예: 다음 예에서는 함수 사용을 보여줍니다. 이 예에서는 FileName과 PageNum이라는 두 개의 매개변수를 호출하는 print_header라는 함수가 정의되어 있습니다. FileName 매개변수는 현재 함수에서 사용하는 파일 이름에 전달되고 PageNum 매개변수는 현재 페이지의 페이지 번호입니다. 이 기능의 기능은 현재 파일의 파일 이름과 현재 페이지의 페이지 번호를 인쇄(표시)하는 것입니다. 이 함수를 완료한 후 이 함수는 다음 페이지의 페이지 번호를 반환합니다.
nawk
>'BEGIN{pageno=1;file=FILENAME
>pageno=print_header(file, pageno) #함수 호출 print_header
>printf("현재 페이지 페이지 번호: %d",pageno);
>}
>#Define function print_header
>function print_header(FileName,PageNum){
>printf( " %s %d",FileName,PageNum); >PageNum++;return PageNUm;
>}
>}' myfile
이 프로그램을 실행하면 다음 내용이 표시됩니다.
myfile 1
현재 페이지 번호는 2
awk 고급 입력 및 출력
1. 다음 레코드 읽기:
다음 명령문입니다. awk는 awk를 발생시킵니다. 다음 레코드를 읽고 패턴 일치를 완료한 후 즉시 해당 작업을 수행합니다. 일반적으로 일치하는 패턴을 사용하여 작업의 코드를 실행합니다. 다음은 이 레코드에 대한 추가 일치 패턴이 무시되도록 합니다.
2. 간단히 레코드 읽기
awk의 getline 문은 간단히 레코드를 읽는 데 사용됩니다. Getline은 사용자가 두 개의 물리적 레코드와 유사한 데이터 레코드를 가지고 있는 경우 특히 유용합니다. 일반 필드의 분리가 완료됩니다(필드 변수 $0 FNR NF NR 설정). 성공하면 1을 반환하고 실패하면 0을 반환합니다(파일 끝에 도달함). 단순히 파일을 읽어야 하는 경우에는 다음 코드를 작성하면 됩니다.
예: getline 사용 예
{while(getline==1)
{
#입력된 필드 처리
}
}
getline 변수를 사용하여 일반 필드를 처리하는 대신 getline을 활성화하여 입력 데이터를 필드에 저장할 수도 있습니다. 이 방법을 사용하면 NF는 0으로 설정되고 FNR과 NR은 증가됩니다.
사용자는 명령줄에 나열된 콘텐츠에서 데이터를 입력하는 대신 getline<"filename"을 사용하여 지정된 파일에서 데이터를 입력할 수도 있습니다. 이 시점에서 getline은 일반 필드 분리(필드 변수 $0 및 NF 설정)를 완료합니다. 파일이 없으면 성공하면 -1, 실패하면 1, 실패하면 0을 반환합니다. 사용자는 주어진 파일의 데이터를 변수로 읽어오거나 파일 이름을 stdin(표준 입력 장치) 또는 파일 이름이 포함된 변수로 바꿀 수 있습니다. 이 방법을 사용할 때 FNR과 NR이 수정되지 않는다는 점은 주목할 가치가 있습니다.
getline 문을 사용하는 또 다른 방법은 다음 예와 같이 UNIX 명령의 입력을 받아들이는 것입니다.
예: UNIX 명령의 입력을 받아들이는 예
{while(" who -u"|getline)
{
#who 명령의 각 줄을 처리합니다
}
}
물론 다음 형식을 사용할 수도 있습니다. :
"command" | getline 변수
3. 파일 닫기:
awk를 사용하면 awk의 close 문을 사용하여 프로그램의 입력 또는 출력 파일을 닫을 수 있습니다.
close("filename")
filename은 getline으로 연 파일일 수 있습니다(stdin, 파일 이름이 포함된 변수 또는 getline에서 사용하는 정확한 명령일 수도 있음). 또는 출력 파일(stdout, 파일 이름을 포함하는 변수 또는 파이프를 사용하는 정확한 명령일 수 있음).
4. 파일로 출력:
awk를 사용하면 다음 방법으로 결과를 파일로 출력할 수 있습니다.
printf("hello word!")>"datafile "
또는
printf("hello word!")>>"datafile"
5. 명령으로 출력
Awk를 사용하면 다음 방법으로 결과를 명령으로 출력할 수 있습니다.
printf("hello word!")|"sort-t','"
awk 및 쉘 스크립트의 하이브리드 프로그래밍
awk는 쉘 명령으로 사용할 수 있기 때문에 awk는 쉘 배치 프로그램과 잘 통합되어 awk와 쉘 프로그램의 혼합 프로그래밍 구현이 가능합니다. 하이브리드 프로그래밍을 구현하는 핵심은 awk와 쉘 스크립트 간의 대화 즉, awk와 쉘 스크립트 간의 정보 교환입니다. awk는 쉘 스크립트에서 필요한 정보(보통 변수의 값)를 얻어 실행합니다. in awk 쉘 명령줄과 쉘 스크립트는 명령 실행 결과를 awk로 보내 처리하고, 쉘 스크립트는 awk의 실행 결과를 읽는 등의 작업을 수행합니다.
1.awk는 Shell 스크립트 프로그램 변수를 읽습니다
awk에서는 "'$variable name'"을 통해 Sell scrpit 프로그램의 변수를 읽을 수 있습니다.
예: 다음 예에서는 Sell scrpit 프로그램에서 Name 변수를 읽습니다. 이 변수는 myfile 텍스트의 작성자를 저장하고 awk는 이름을 인쇄합니다.
$cat writename
:
# @(#)
#
.
Name="Zhang San" nawk 'BEGIN { name="'이름'"; printf("%s 작성자: %s",FILENAME,name");}
{...}END{...}' myfile
.
.
.
2. 쉘 명령의 실행 결과를 awk로 보내 처리합니다.
정보 전송 방법으로 파이프라인을 통해 쉘 명령의 결과를 보낼 수 있습니다( |) 처리를 위해 awk에 전달됨:
예: awk 예는 쉘 명령의 실행 결과를 처리합니다.
$who -u | awk '{printf("%s is running %s" ,$2,$1) }'
이 명령은 등록된 터미널에서 실행 중인 프로그램의 이름을 출력합니다
3. 쉘 스크립트 프로그램은 awk의 실행 결과를 읽습니다
쉘 스크립트 프로그램 읽기를 구현하기 위해 몇 가지 특별한 방법을 사용하여 awk 실행 결과를 얻을 수 있습니다. 예를 들어 변수 이름 형식으로 쉘 스크립트 변수에 저장할 수 있습니다. 물론 `awk 문`을 사용하여 awk 실행 결과를 저장할 수도 있습니다.
예: 메시지 전송 메커니즘 중 하나로 UNIX 모든 사용자에게 메시지를 전송하는 명령 벽을 제공합니다(모든 사용자에게 쓰기를 의미). 이 명령을 사용하면 모든 작업 사용자(터미널)에게 메시지를 보낼 수 있습니다. 이를 위해 쉘 배치 프로그램 wall.shell을 통해 이 프로그램을 시뮬레이션할 수 있습니다. 사실, 이전 버전에서는 wall이 쉘 배치 프로그램입니다:
$cat wall.shell
:
# @(#) wall.shell: 등록된 각 터미널에 메시지 보내기
#
cat >/tmp/$$
#읽는 동안 사용자 입력 메시지 텍스트 who -u | awk '{print $2}' | tty
do
cat /tmp/$$>$ tty
done
이 프로그램에서 awk는 who -u 명령의 실행 결과를 수락합니다. 이 명령은 등록된 모든 터미널의 정보를 인쇄합니다. 터미널이므로 awk 명령을 사용하여 장치 이름을 추출한 다음 while read를 사용하십시오. tty 문은 이러한 파일 이름을 정보 전송의 끝 주소로 변수(쉘 스크립트 변수) tty로 루프합니다.
4. awk에서 쉘 명령줄 실행---embedded function system()
system()은 문자나 숫자 유형에 적합하지 않은 내장 함수입니다. 이 함수는 인수로 전달된 문자열을 처리합니다. 시스템은 이 매개변수를 명령으로 처리합니다. 즉, 명령줄로 실행합니다. 이를 통해 사용자는 자신의 awk 프로그램에서 필요할 때 명령이나 스크립트를 실행할 수 있는 유연성을 얻을 수 있습니다.
예: 다음 프로그램은 시스템 내장 기능을 사용하여 사용자가 준비한 보고서 파일을 인쇄합니다. 이 파일은 myreport.txt라는 파일에 저장됩니다. 단순화를 위해 END 부분만 나열합니다:
.
.
END {close("myreport.txt");system("lp myreport.txt" );}
이 예에서는 먼저 close 문을 사용하여 myreport.txt 파일을 닫은 다음 시스템에 포함된 기능을 사용하여 myreport.txt를 프린터로 보내 인쇄합니다.
이 글을 쓰면서 친구들에게 작별 인사를 해야 합니다. 솔직히 말해서 이 내용들은 여전히 awk에 대한 예비 지식에 불과하며 awk도 예외는 아닙니다. 당신이 앞으로 가야 할 긴 길에 작은 시작을 열어주고 나머지 길은 당신 스스로 걸어가야 합니다. 솔직히 말해서, 이 기사가 여러분의 앞으로 나아갈 길에 약간의 편의를 가져다 줄 수 있다면 저는 만족할 것입니다!
이 글에 대해 궁금한 점이 있으시면 이메일(Chizlong@yeah.net)이나 홈페이지(http://chizling.yeah.net)에 글을 남겨주세요.
부록:
1.awk의 정규식 메타문자
이스케이프 시퀀스
^ 문자열 시작 부분에서 일치를 시작합니다.
$ 다음에서 시작하여 일치합니다. 문자열
의 끝. 단일 문자열
과 일치합니다. [ABC] []
내의 모든 문자와 일치합니다.[A-Ca-c]는 A-C 및 a-c 범위의 문자와 일치합니다(알파벳 순서).
[^ABC]는 []의 모든 문자를 제외한 모든 문자와 일치합니다.
Desk|Chair는 책상 또는 의자와 일치합니다.
[ABC][DEF] 협회. A, B, C 중 임의의 문자와 일치하며, 그 뒤에는 D, E, F 중 임의의 문자가 와야 합니다.
* 0회 이상 나타나는 모든 문자 A, B 또는 C와 일치
+ 1회 이상 나타나는 모든 문자 A, B 또는 C와 일치
? 빈 문자열 또는 A, B 또는 C의 임의의 문자와 일치
(Blue|Black)berry 정규식을 결합하여 Blueberry 또는 Blackberry와 일치
2.awk 산술 연산자
연산자 사용법
------
x^y x의 y제곱
x**y 위와 동일
x %y 나머지 계산 x/y(모듈로)
x+y x 더하기 y
x-y x 빼기 y
x*y x 곱하기 y
x/y x 나누기 y
-y 음수 y(스위치 기호 of y); 이치모쿠 뺄셈이라고도 함
++y y에 1을 더한 후 y(접두사 추가) 사용
y++ y 값을 사용한 다음 1(접미사 추가) 추가
--y y 뒤에 1을 뺍니다 y 사용(접두사 빼기)
y-- 1을 뺀 후 y 사용(접미사 빼기)
x=y y 값을 x에 할당
x+=y x 값 할당 +y를 x
x-=y x-y의 값을 x에 할당
x*=y x*y의 값을 x에 할당
x/=y x/y의 값을 x x에 할당 %=y x%y의 값을 x에 할당
x^=y x^y의 값을 x에 할당
x**=y x**y의 값을 x에 할당
3. awk에서 허용되는 테스트:
연산자 의미
x==y x는 y와 같습니다
x!=y x는 y와 같지 않습니다
x>y x는 y보다 큼
x>= y x는 y보다 크거나 같습니다.
x
x~re x가 일치합니까? 정규식 re?
x!~re x가 정규식 연산자와 일치하지 않습니다.
4.awk(우선순위 오름차순으로 정렬)
= , + = , -= , *= ,/= , %=
||
&&
>= <= == != ~ !~
xy(문자열 연결, 'x'y'는 "xy"가 됨)
+ -
* / %
++ --
5.awk 내장 변수(사전 정의된 변수)
참고: 표의 v 항목은 변수를 지원하는 첫 번째 도구를 나타냅니다(아래도 동일). ): A=awk, N=nawk, P=POSIX awk, G=gawk
V 기본값을 의미하는 변수
------ ------------------------------ ---------
N ARGC 명령줄 매개변수 수
G ARGIND 현재 처리된 파일의 ARGV 식별자
N ARGV 명령줄 매개변수 배열
G CONVFMT 디지털 변환 형식 %. 6g
P ENVIRON UNIX 환경 변수
N ERRNO UNIX 시스템 오류 메시지
G FIELDWIDTHS 공백으로 구분된 입력 필드 너비 문자열
A FILENAME 현재 입력 파일의 이름
P FNR 현재 레코드 수
A FS 입력 필드 구분자 공백
G IGNORECASE 대소문자 구분 구분 0(대소문자 구분)
A NF 현재 레코드의 필드 수
A NR read
A OFMT 숫자 출력 형식 %.6g
A OFS 출력 필드 구분자 공백
ORS 출력 레코드 구분자 새 줄
A RS 입력 레코드 구분자 새 줄
N RSTART 일치하는 첫 번째 문자열 매칭 함수
N RLENGTH 매칭 함수와 매칭된 문자열의 길이
N SUBSEP 첨자 구분자 "34"
6.awk 내장 함수
V 함수 목적 또는 반환 값
--------------- ------------------ ----
N gsub(reg,string,target) 각 정규식 수식 reg와 일치할 때 대상의 문자열을 교체합니다.
N index(search,string) 문자열에서 검색 문자열의 위치를 반환합니다.
A length(string) 문자열의 문자 수를 찾습니다.
N match(string, reg) 정규식 reg와 일치하는 문자열의 위치를 반환합니다.
N printf(format,variable)는 문자열의 형식을 지정합니다. format에서 제공하는 형식으로 변수 변수를 출력하고 출력합니다.
N 분할(문자열,저장소,delim) 구분 기호 구분에 따라 문자열을 저장소의 배열 요소로 분해합니다.
N sprintf(형식, 변수) 형식에 따라 형식화된 데이터를 반환하며, 변수는 문자열
G strftime(format,timestamp)의 데이터는 형식을 기반으로 날짜 또는 시간 문자열을 반환합니다. timestmp는 systime() 함수에서 반환된 시간입니다.
N sub(reg,string,target)은 처음으로 정규식으로 사용됨 수식 reg 일치, 대상 문자열의 문자열 바꾸기
A substr(string,position,len) 위치 len 문자로 시작하는 하위 문자열을 반환합니다.
P totower(string) 반환 문자열의 해당 소문자
P toupper(string)는 문자열의 해당 대문자를 반환합니다.
A atan(x,y) x(라디안)의 코탄젠트
N cos(x) x(라디안)의 코사인 )
A exp (x) e의 x 거듭제곱
A int(x) x의 정수 부분
A log(x) x의 자연 로그
N rand() 사이의 난수 0-1
N sin(x) x의 사인(라디안)
A sqrt(x) x의 제곱근
A srand(x) 난수 생성기를 초기화합니다. x가 생략된 경우 system()을 사용하세요.
G system()은 1970년 1월 1일 이후 경과된 시간을 초 단위로 반환합니다.
AWK 명령어 관련 더 자세한 글은 PHP 중국어 홈페이지를 참고해주세요!