awk 학습을 위한 실무 가이드
무료 eBook을 다운로드하여 awk 명령을 더 잘 다루세요.
시중에 나와 있는 모든 Linux 명령(그리고 그 수도 많습니다) 중에서 가장 전형적인 세 가지 명령은 sed, awk 및 grep인 것 같습니다. 어쩌면 이름의 난해한 소리일 수도 있고, 잠재적인 용도의 폭이나 나이일 수도 있지만, 누군가가 "Linuxy" 명령의 예를 제시할 때 일반적으로 이 세 가지 중 하나입니다. sed 및 grep에는 몇 가지 간단한 한 줄 표준이 있지만 덜 권위 있는 awk는 특히 수수께끼로 남아 있습니다.
빠른 문자열 교체를 위해 sed를 사용하거나 매일 패턴을 필터링하기 위해 grep를 사용할 가능성이 높습니다. awk 명령을 작성할 가능성이 훨씬 적습니다. 나는 종종 이것이 왜 그런지 궁금해하며 그 원인을 몇 가지로 생각합니다. 우선, 우리 중 많은 사람들은 이 두 명령에 대한 약간의 변형을 제외하고는 sed 및 grep를 거의 사용하지 않습니다.
$ sed -e 's/foo/bar/g' file.txt
$ grep foo file.txt따라서 sed 및 grep를 사용하는 것이 더 편할지라도 그 잠재력을 최대한 활용하지 못할 수도 있습니다. 물론 sed나 grep에 대해 더 자세히 알아야 할 의무는 없지만 명령을 "학습"하는 방법이 궁금할 때가 있습니다. 명령이 어떻게 작동하는지 배우는 대신 명령이 포함된 특정 주문을 배우는 경우가 많습니다. 그러다 보니 명령에 대해 잘못된 익숙함을 느끼는 경우가 많습니다. 나는 옵션이 무엇을 하는지 모르고 구문을 정확히 파악할 수 없음에도 불구하고 머리 위에서 서너 가지 옵션의 이름을 지정할 수 있기 때문에 명령을 알고 있다고 생각합니다.
그리고 이것이 awk의 강력함과 유연성에 직면할 때 많은 사람들이 직면하는 문제라고 생각합니다.
awk를 사용하여 awk 배우기
awk의 기본은 놀라울 정도로 간단합니다. awk는 프로그래밍 언어라는 사실이 종종 언급되며, 비교적 기본적인 언어이기는 하지만 사실입니다. 즉, 새로운 코딩 언어를 배우는 것과 같은 방식으로 awk를 배울 수 있습니다. 몇 가지 기본 명령을 사용하여 구문을 배우고, 복잡한 작업을 구축할 수 있도록 어휘를 배운 다음 연습하고, 연습하고, 연습하세요. .
awk가 입력을 구문 분석하는 방법
Awk는 기본적으로 입력을 배열로 봅니다. awk가 텍스트 파일을 검색할 때 각 줄을 개별적으로 연속적으로 기록으로 처리합니다. 각 기록은 필드로 구분됩니다. 물론 awk는 이 정보를 추적해야 하며 NR(레코드 수) 및 NF(번호)를 사용하여 해당 데이터를 볼 수 있습니다. 필드) 내장 변수. 예를 들어, 다음은 파일의 줄 수를 제공합니다.
$ awk 'END { print NR;}' example.txt
36이는 awk 구문에 대한 정보도 보여줍니다. awk를 단일 라이너로 작성하든, 자체 포함 스크립트로 작성하든 awk 명령의 구조는 다음과 같습니다.
pattern or keyword { actions }이 예에서 END라는 단어는 패턴이 아닌 특별한 예약 키워드입니다. 유사한 키워드는 BEGIN입니다. 이 두 키워드를 모두 사용하면 awk는 데이터 구문 분석 시작 또는 끝 부분에 중괄호 안에 있는 작업을 실행합니다.
패턴을 필터나 한정자로 사용하여 awk가 패턴을 현재 레코드와 일치시킬 수 있을 때만 지정된 작업을 실행할 수 있습니다. 예를 들어, 텍스트 파일에서 Linux라는 단어를 찾기 위해 grep처럼 awk를 사용한다고 가정해 보겠습니다.
$ awk '/Linux/ { print $0; }' os.txt
OS: CentOS Linux (10.1.1.8)
OS: CentOS Linux (10.1.1.9)
OS: Red Hat Enterprise Linux (RHEL) (10.1.1.11)
OS: Elementary Linux (10.1.2.4)
OS: Elementary Linux (10.1.2.5)
OS: Elementary Linux (10.1.2.6)awk의 경우 파일의 각 줄은 레코드이고 레코드의 각 단어는 필드입니다. 기본적으로 필드는 공백으로 구분됩니다. FS(필드 구분 기호) 변수를 원하는 대로 설정하는 --field-separator 옵션을 사용하여 이를 변경할 수 있습니다.
$ awk --field-separator ':' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)이 샘플에서는 소스 텍스트의 각 콜론(:) 뒤에 공백이 있으므로 각 목록 앞에 빈 공백이 있습니다. 하지만 이는 잘라내기가 아니므로 필드 구분 기호를 한 문자로 제한할 필요는 없습니다.
$ awk --field-separator ': ' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)awk의 기능
다음 구문을 사용하여 awk에서 자신만의 함수를 작성할 수 있습니다.
name(parameters) { actions }함수를 사용하면 코드를 한 번 작성하고 작업 전반에 걸쳐 재사용할 수 있으므로 중요합니다. 한 줄짜리 코드를 구성할 때 사용자 정의 함수는 스크립트에 있는 것보다 약간 덜 유용하지만 awk는 이미 많은 함수를 정의합니다. 기본적으로 다른 언어나 스프레드시트의 함수와 동일하게 작동합니다. 함수에 정보가 필요한 순서를 배우고 결과를 얻기 위해 원하는 대로 공급할 수 있습니다.
수학적 연산과 문자열 처리를 수행하는 함수가 있습니다. 수학 문제는 종종 매우 간단합니다. 숫자를 제공하면 숫자가 잘립니다.
$ awk 'BEGIN { print sqrt(1764); }'
42문자열 함수는 더 복잡할 수 있지만 GNU awk 매뉴얼에 잘 문서화되어 있습니다. 예를 들어, split 함수는 awk가 단일 필드로 보는 항목을 가져와 여러 부분으로 분할합니다. 필드, 분할의 각 부분을 포함하는 배열로 사용할 변수, 구분 기호로 사용할 문자가 필요합니다.
이전 예제의 출력을 사용하면 각 레코드의 맨 끝에 IP 주소가 있다는 것을 알 수 있습니다. 이 경우 변수 NF를 참조하여 레코드의 마지막 필드만 split 함수로 보낼 수 있습니다. 왜냐하면 여기에는 필드 수가 포함되어 있기 때문입니다(그리고 마지막 필드는 반드시 가장 높은 숫자가 됨):
$ awk --field-separator ': ' '/Linux/ { split($NF, IP, "."); print "subnet: " IP[3]; }' os.txt
subnet: 1
subnet: 1
subnet: 1
subnet: 2
subnet: 2
subnet: 2더 많은 기능이 있으며 awk 코드 블록당 하나로 제한할 이유가 없습니다. 터미널에서 awk를 사용하여 복잡한 파이프라인을 구성하거나 awk 스크립트를 작성하여 자신만의 기능을 정의하고 활용할 수 있습니다.
eBook 다운로드
awk를 배우는 것은 대부분 awk를 사용하는 문제입니다. sed, grep, cut, tr 또는 기타 다른 기능을 사용하여 이미 가지고 있는 기능을 복제하는 경우에도 사용하세요. 완벽하게 유효한 명령입니다. 익숙해지면 사용자 정의 awk 명령을 호출하는 Bash 함수를 작성하여 더 쉽게 사용할 수 있습니다. 그리고 결국에는 복잡한 데이터 세트를 구문 분석하는 스크립트를 작성할 수 있게 됩니다.
eBook을 다운로드하여 awk에 대해 알아야 할 모든 것을 알아보세요. 오늘부터 사용해 보세요.