
리눅스에서는 awk 강력한 스크립팅 언어는 물론 명령 줄 텍스트 조작 다이너 모입니다. 다음은 멋진 기능 중 일부에 대한 소개입니다.
awk의 이름은 어떻게
그만큼 awk 1977 년에 오리지널 버전을 쓴 세 사람의 이니셜을 사용하여 이름을 붙였습니다 : Alfred Aho, Peter Weinberger, Brian Kernighan. 이 세 사람은 전설적인 AT & T Bell Laboratories Unix 판테온 출신입니다. 그 이후로 많은 사람들의 공헌으로 awk 계속 진화했습니다.
전체 스크립팅 언어이며 명령 줄을위한 완벽한 텍스트 조작 툴킷입니다. 이 기사가 당신의 식욕을 자극하면, 당신은에 대한 모든 세부 사항을 확인할 수 있습니다 awk 그리고 그 기능.
규칙, 패턴 및 동작
awk 패턴과 동작으로 구성된 규칙이 포함 된 프로그램에서 작동합니다. 작업은 패턴과 일치하는 텍스트에서 실행됩니다. 패턴은 중괄호 ({}). 패턴과 행동이 함께 규칙을 형성합니다. 전체 awk 프로그램은 작은 따옴표 (').
가장 간단한 유형을 살펴 보겠습니다 awk 프로그램. 패턴이 없으므로 입력 된 모든 텍스트 줄과 일치합니다. 이는 작업이 모든 라인에서 실행됨을 의미합니다. 우리는 그것을 출력에 사용할 것입니다. who 명령.
표준 출력은 다음과 같습니다. who:
who

아마도 우리는 모든 정보가 필요하지는 않지만 계정의 이름을보고 싶을 것입니다. 우리는 출력을 파이프로 만들 수 있습니다 who 으로 awk그리고 말해 awk 첫 번째 필드 만 인쇄합니다.
기본적으로, awk 필드를 공백, 줄의 시작 또는 줄의 끝으로 둘러싸인 문자열로 간주합니다. 필드는 달러 기호 ($) 및 숫자 그래서, $1 첫 번째 필드를 나타내며 print 첫 번째 필드를 인쇄하는 작업입니다.
우리는 다음을 입력합니다 :
who | awk '{print $1}'

awk 첫 번째 필드를 인쇄하고 나머지 행을 버립니다.
원하는만큼 많은 필드를 인쇄 할 수 있습니다. 구분자로 쉼표를 추가하면 awk 각 필드 사이에 공백을 인쇄합니다.
로그인 한 시간 (필드 4)도 인쇄하려면 다음을 입력하십시오.
who | awk '{print $1,$4}'

몇 가지 특수 필드 식별자가 있습니다. 이들은 전체 텍스트 줄과 텍스트 줄의 마지막 필드를 나타냅니다.
- $ 0: 전체 텍스트 줄을 나타냅니다.
- $ 1: 첫 번째 필드를 나타냅니다.
- 2 달러: 두 번째 필드를 나타냅니다.
- $ 7: 일곱 번째 필드를 나타냅니다.
- $ 45: 45 번째 필드를 나타냅니다.
- $ NF: “필드 수”를 나타내며 마지막 필드를 나타냅니다.
다음을 입력하여 Dennis Ritchie의 작은 따옴표가 포함 된 작은 텍스트 파일을 불러옵니다.
cat dennis_ritchie.txt

우리는 원한다 awk 견적의 첫 번째, 두 번째 및 마지막 필드를 인쇄합니다. 터미널 창에 둘러싸여 있지만 한 줄의 텍스트 일뿐입니다.
다음 명령을 입력합니다 :
awk '{print $1,$2,$NF}' dennis_ritchie.txt

우리는“단순성”을 모른다. 텍스트 줄의 18 번째 필드이며 걱정하지 않아도됩니다. 우리가 아는 것은 마지막 필드이며 사용할 수 있습니다. $NF 그 가치를 얻을 수 있습니다. 마침표는 필드 본문에서 다른 문자로 간주됩니다.
출력 필드 구분 기호 추가
당신은 또한 말할 수 있습니다 awk 기본 공백 문자 대신 필드 사이에 특정 문자를 인쇄합니다. 의 기본 출력 date 명령은 약간 특이합니다. 시간이 그 중간에 꽂혀 있기 때문입니다. 그러나 다음을 입력하여 사용할 수 있습니다 awk 원하는 필드를 추출하려면 :
date
date | awk '{print $2,$3,$6}'

우리는 OFS 월, 일 및 연도 사이에 구분 기호를 넣는 변수 (출력 필드 구분 기호) 아래에서 명령을 작은 따옴표로 묶습니다 ('), 중괄호 아님 ({}) :
date | awk 'OFS="https://www.howtogeek.com/" {print$2,$3,$6}'
date | awk 'OFS="-" {print$2,$3,$6}'

시작과 끝 규칙
ㅏ BEGIN 텍스트 처리가 시작되기 전에 규칙이 한 번 실행됩니다. 사실, 그것은 전에 실행 awk 모든 텍스트를 읽습니다. 안 END 모든 처리가 완료된 후 규칙이 실행됩니다. 여러 개를 가질 수 있습니다 BEGIN 과 END 규칙을 순서대로 실행합니다.
우리의 예를 들어 BEGIN 규칙에서 우리는 전체 견적을 인쇄합니다 dennis_ritchie.txt 이전에 제목과 함께 사용했던 파일입니다.
이렇게하려면 다음 명령을 입력하십시오.
awk 'BEGIN {print "Dennis Ritchie"} {print $0}' dennis_ritchie.txt

참고 BEGIN 규칙에는 자체 중괄호 세트로 묶인 자체 조치 세트가 있습니다 ({}).
우리는 출력을 파이프하기 위해 이전에 사용한 명령과 동일한 기술을 사용할 수 who 으로 awk. 이렇게하려면 다음을 입력하십시오.
who | awk 'BEGIN {print "Active Sessions"} {print $1,$4}'

입력 필드 구분자
네가 원한다면 awk 필드를 구분하기 위해 공백을 사용하지 않는 텍스트를 사용하려면 텍스트를 필드 구분 기호로 사용하는 문자를 알려야합니다. 예를 들어 /etc/passwd 파일은 콜론 (:)를 사용하여 필드를 구분하십시오.
우리는 그 파일과 -F (세퍼레이터 문자열) 옵션 awk 콜론 (:)를 구분 기호로 사용하십시오. 우리는 다음을 입력하여 알려줍니다 awk 사용자 계정 이름과 홈 폴더를 인쇄하려면
awk -F: '{print $1,$6}' /etc/passwd

출력에는 사용자 계정 이름 (또는 응용 프로그램 또는 데몬 이름)과 홈 폴더 (또는 응용 프로그램의 위치)가 포함됩니다.

패턴 추가
관심이있는 모든 사용자가 일반 사용자 계정 인 경우 인쇄 작업에 패턴을 포함시켜 다른 모든 항목을 필터링 할 수 있습니다. 사용자 ID 번호는 1,000보다 크거나 같기 때문에 해당 정보를 기반으로 필터를 만들 수 있습니다.
세 번째 필드 ($3)의 값은 1,000 이상입니다.
awk -F: '$3 >= 1000 {print $1,$6}' /etc/passwd
= 1000 터미널 창에서 {print $ 1, $ 6} '/ etc / passwd “명령.” width = “646”height = “147”onload = “pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);” onerror = “this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”>
패턴은 연관된 작업 바로 앞에 있어야합니다.
우리는 사용할 수 있습니다 BEGIN 우리의 작은 보고서에 대한 제목을 제공하는 규칙. 우리는 (n제목 문자열에 줄 바꿈 문자를 삽입하는 표기법 :
awk -F: 'BEGIN {print "User Accountsn-------------"} $3 >= 1000 {print $1,$6}' /etc/passwd
= 1000 터미널 창에서 {print $ 1, $ 6} '/ etc / passwd “명령.” width = “646”height = “212”onload = “pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);” onerror = “this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”>
패턴은 본격적인 정규 표현이며 of의 영광 중 하나입니다. awk.
마운트 된 파일 시스템의 UUID (Universally Unique Identifier)를보고 싶다고 가정 해 봅시다. 우리가 검색하면 /etc/fstab 문자열 “UUID”가 발생하면 파일을 반환해야합니다.
다음 명령에서 검색 패턴“/ UUID /”를 사용합니다.
awk '/UUID/ {print $0}' /etc/fstab

“UUID”의 모든 항목을 찾아 해당 행을 인쇄합니다. 우리는 실제로 동일한 결과를 얻지 못했을 것입니다. print 기본 동작은 전체 텍스트 줄을 인쇄하기 때문에 동작입니다. 명확하게하기 위해 종종 명시적인 것이 유용합니다. 스크립트 나 기록 파일을 살펴보면 실마리를 남기게되어 기쁩니다.
찾은 첫 번째 줄은 주석 줄이며 “UUID”문자열이 가운데에 있지만 awk 여전히 찾았습니다. 정규식을 조정하고 말할 수 있습니다 awk “UUID”로 시작하는 줄만 처리합니다. 그렇게하기 위해, 우리는 시작 토큰을 포함하여 다음을 입력합니다 (^) :
awk '/^UUID/ {print $0}' /etc/fstab

그게 낫다! 이제는 실제 마운트 지침 만 볼 수 있습니다. 출력을 더 세분화하려면 다음을 입력하고 첫 번째 필드로 표시를 제한하십시오.
awk '/^UUID/ {print $1}' /etc/fstab

이 시스템에 여러 파일 시스템이 마운트되어 있으면 깔끔한 UUID 테이블이 제공됩니다.
내장 함수
awk 명령 줄과 스크립트에서 자신의 프로그램에서 호출하고 사용할 수있는 많은 기능이 있습니다. 파기를하면 아주 유익합니다.
함수를 호출하는 일반적인 기술을 보여주기 위해 몇 가지 숫자를 살펴 보겠습니다. 예를 들어, 다음은 제곱근 625를 인쇄합니다.
awk 'BEGIN { print sqrt(625)}'
이 명령은 아크 탄젠트를 0 (영)과 -1 (수학적 상수 pi)로 인쇄합니다.
awk 'BEGIN {print atan2(0, -1)}'
다음 명령에서 결과를 수정합니다 atan2() 인쇄하기 전에 기능 :
awk 'BEGIN {print atan2(0, -1)*100}'
함수는 표현식을 매개 변수로 승인 할 수 있습니다. 예를 들어 다음은 25의 제곱근을 구하는 복잡한 방법입니다.
awk 'BEGIN { print sqrt((2+3)*5)}'

awk 스크립트
커맨드 라인이 복잡해 지거나 다시 사용하고자하는 루틴을 개발하면 awk 스크립트로 명령하십시오.
예제 스크립트에서는 다음을 모두 수행합니다.
- 스크립트 실행에 사용할 실행 파일을 쉘에 알려주십시오.
- 준비
awk사용하기 위해FS필드를 콜론으로 구분하여 입력 텍스트를 읽는 필드 구분자 변수 (:). - 사용
OFS출력 필드 구분 기호awk콜론 (:)를 사용하여 출력에서 필드를 구분하십시오. - 카운터를 0으로 설정하십시오.
- text 각 텍스트 행의 두 번째 필드를 빈 값으로 설정하십시오 (항상 “x”이므로 볼 필요가 없습니다).
- 수정 된 두 번째 필드가있는 줄을 인쇄하십시오.
- 카운터를 증가시킵니다.
- 카운터 값을 인쇄하십시오.
우리의 스크립트는 아래와 같습니다.

그만큼 BEGIN 규칙은 준비 단계를 수행하는 반면 END 규칙은 카운터 값을 표시합니다. 중간 규칙 (이름과 패턴이 없어 모든 행과 일치)은 두 번째 필드를 수정하고 행을 인쇄하며 카운터를 증가시킵니다.
스크립트의 첫 번째 줄은 사용할 실행 파일을 쉘에 알려줍니다 (awk스크립트를 실행합니다. 또한 통과 -f (파일 이름) 옵션 awk, 처리 할 텍스트가 파일에서 나옵니다. 파일 이름을 실행할 때 파일 이름을 스크립트로 전달합니다.
잘라내어 붙여 넣을 수 있도록 아래 스크립트를 텍스트로 포함 시켰습니다.
#!/usr/bin/awk -f
BEGIN {
# set the input and output field separators
FS=":"
OFS=":"
# zero the accounts counter
accounts=0
}
{
# set field 2 to nothing
$2=""
# print the entire line
print $0
# count another account
accounts++
}
END {
# print the results
print accounts " accounts.n"
}
이것을라는 파일에 저장하십시오 omit.awk. 스크립트를 실행 가능하게 만들려면 다음을 사용하여 다음을 입력하십시오. chmod:
chmod +x omit.awk

이제 우리는 그것을 실행하고 /etc/passwd 스크립트에 파일. 이것은 파일입니다 awk 스크립트 내 규칙을 사용하여 우리를 위해 처리합니다.
./omit.awk /etc/passwd

아래와 같이 파일이 처리되고 각 줄이 표시됩니다.

두 번째 필드의 “x”항목은 제거되었지만 필드 구분 기호는 여전히 존재합니다. 라인이 계산되고 총계가 출력의 맨 아래에 제공됩니다.
awk는 어색함을 의미하지 않습니다
awk 어색하지 않습니다. 우아함을 의미합니다. 처리 필터 및 보고서 작성기로 설명되었습니다. 보다 정확하게는 두 가지 모두 또는 두 가지 작업 모두에 사용할 수있는 도구입니다. 몇 줄로 awk 전통적인 언어로 광범위한 코딩이 필요한 것을 달성합니다.
이러한 기능은 패턴을 포함하고 처리 할 텍스트를 선택하는 규칙과 처리를 정의하는 조치를 포함하는 단순한 규칙 개념에 의해 활용됩니다.








