셸 텍스트 필터 프로 그래 밍 (2): awk 의 기초
이전 절 에 서 는 grep 명령 을 말 했 습 니 다. grep 명령 은 규칙 에 맞 는 줄 정 보 를 얻 는 데 사 용 됩 니 다.이 절 에서 말 할 awk 는 특정한 파일 이나 문자열 에서 지정 한 텍스트 필드 를 가 져 오 는 데 강력 한 기능 을 합 니 다.
a. w k 언어의 가장 기본 적 인 기능 은 파일 이나 문자열 에서 지정 한 규칙 을 바탕 으로 정 보 를 탐색 하고 추출 하 는 것 입 니 다.a. w k 에서 정 보 를 추출 한 후에 야 다른 텍스트 작업 을 할 수 있 습 니 다.전체 a w k 스 크 립 트 는 보통 텍스트 파일 의 정 보 를 포맷 하 는 데 사 용 됩 니 다.
명령 행 에서 awk 명령 식 을 호출 할 때 가장 자주 사용 하 는 awk 방식:
awk [-F separator] ‘cmd’ filename
cmd 는 진정한 awk 명령 입 니 다. [- F 도 메 인 구분자] 는 선택 할 수 있 습 니 다. a w k 는 빈 칸 을 부족 한 도 메 인 구분자 로 사용 하기 때문에 도 메 인 사이 에 빈 칸 이 있 는 텍스트 를 찾 으 려 면 이 옵션 을 지정 할 필요 가 없습니다. 단, p a s s w d 파일 을 찾 으 려 면 각 도 메 인 에서 콜론 으로 구분자 로 표시 해 야 합 니 다. - F 옵션, 예 를 들 어:
awk -F: ‘{cmd}’/etc/passwd
awk 는 호출 할 때 한 줄 의 기록 이나 한 줄 을 읽 고 지정 한 분할 도 메 인 을 사용 하여 지정 한 도 메 인 (분할 도 메 인 이 설정 되 지 않 았 을 때 기본 값 은 빈 칸) 을 분할 한 다음 $1, $2 로 표시 합 니 다. $n, 이 도 메 인 표 지 를 사용 하면 도 메 인 을 더욱 쉽게 처리 할 수 있 습 니 다.그리고 awk 명령 부분 을 실행 한 다음 awk 는 파일 전 체 를 읽 을 때 까지 다음 줄 의 내용 을 읽 기 시작 합 니 다.
awk 명령 동작 은 대괄호 {} 에서 지 정 됩 니 다.동작 은 대부분 인쇄 에 사용 되 지만 if 와 순환 (looping) 구문 및 순환 종료 구조 와 같은 더 긴 코드 가 있 습 니 다.
예 를 들 기 전에 파일 을 만 듭 니 다 (/etc/group 파일 의 수정). 다음 과 같 습 니 다.
# cat group_file1
wireshark x 987
usbmon x 986
jackuser x 985
vboxusers x 984 allen
aln x 1001
#
첫 번 째 예시:# awk '{print}' group_file1
wireshark x 987
usbmon x 986
jackuser x 985
vboxusers x 984 allen
aln x 1001
#
이 명령 은 cat 명령 효과 와 마찬가지 로 파일 내용 을 직접 출력 합 니 다.이 awk 의 명령 부분 은 print 입 니 다. awk 를 실행 할 때 각 줄 에 print 명령 을 순서대로 실행 합 니 다. 그 는 파일 의 모든 줄 내용 을 인쇄 합 니 다.여기에 도 다른 코드 가 있 을 수 있 고 입력 한 줄 과 무관 할 수도 있 습 니 다.예 를 들 어 실행:# awk '{print "hello awk!"}' group_file1
hello awk!
hello awk!
hello awk!
hello awk!
hello awk!
몇 줄 의 파일 이 있 으 면 몇 줄 의 Hello awk!awk 는 여러 논리 필드 로 나 뉘 어 진 텍스트 를 잘 처리 하고 awk 스 크 립 트 의 모든 독립 된 필드 를 어렵 지 않 게 참조 할 수 있 습 니 다.위의 파일 에 대해 우 리 는 각 줄 의 첫 번 째 열 과 세 번 째 열 내용 을 추출 할 수 있 습 니 다 (- F 가 지정 되 지 않 았 을 때 기본 값 은 빈 칸 입 니 다). 다음 과 같 습 니 다.
# awk '{print $1 $3}' group_file1
wireshark987
usbmon986
jackuser985
vboxusers984
aln1001
출력 결과 가 붙 었 습 니 다. 우 리 는 문자 분할 을 추가 할 수 있 습 니 다.# awk '{print "group:"$1 "\tid:"$3}' group_file1
group:wireshark id:987
group:usbmon id:986
group:jackuser id:985
group:vboxusers id:984
group:aln id:1001
{} 에 서 는 즉시 $1 사이 에 3 달러 의 빈 칸 이 있 고 빈 칸 이 인쇄 되 지 않 습 니 다. 분할 인쇄 를 출력 하기 위해 서 는 문자열 을 추가 해 야 합 니 다. 또한 쉼표 를 추가 할 수도 있 습 니 다. 출력 할 때 빈 칸 분할 이 있 습 니 다.이렇게 하면 훨씬 예 쁘 지 않 습 니까? awk 가 매우 강하 다 는 느낌 이 들 지 않 습 니까? 조급해 하지 않 고 이제 막 시 작 했 습 니 다.
다른 셸 명령 처럼 awk 명령 도 스 크 립 트 파일 에 넣 을 수 있 습 니 다.스 크 립 트 파일 을 실행 하여 awk 명령 을 실행 합 니 다.스 크 립 트 내용 및 실행 결 과 는 다음 과 같 습 니 다.
# cat 1_awk.sh
#!/bin/sh
awk '{print "name:"$1 "\tid:"$3}' group_file1
# ./1_awk.sh
name:wireshark id:987
name:usbmon id:986
name:jackuser id:985
name:vboxusers id:984
name:aln id:1001
보통 입력 줄 마다 awk 는 스 크 립 트 코드 블록 을 한 번 씩 실행 합 니 다.그러나 많은 프로 그래 밍 상황 에서 awk 가 입력 파일 의 텍스트 를 처리 하기 전에 초기 화 코드 를 실행 해 야 할 수도 있 습 니 다.이 경우 awk 는 BEGIN 블록 을 정의 할 수 있 습 니 다.awk 는 입력 파일 을 처리 하기 전에 BEGIN 블록 을 실행 하기 때문에 FS (필드 구분자) 변 수 를 초기 화하 고 머 릿 말 을 인쇄 하거나 프로그램 에서 나중에 참조 할 전역 변 수 를 초기 화 하 는 데 좋 은 위치 입 니 다.awk 는 END 블록 이라는 또 다른 특수 블록 을 제공 했다.awk 는 입력 파일 의 모든 줄 을 처리 한 후에 이 블록 을 실행 합 니 다.일반적으로 END 블록 은 출력 흐름 의 끝 에 나타 나 야 할 요약 정 보 를 최종 계산 하거나 인쇄 하 는 데 사 용 됩 니 다.
위의 예 를 수정 하고 BEGIN 과 END 블록 을 추가 합 니 다.
#!/bin/sh
awk '
BEGIN {
print " Name\tID
==========================="
}
{
print "name:"$1 "\tid:"$3
}
END {
print "=============END============="
}
' group_file1
빈 칸 으로 나 누 지 않 은 줄 에 대해 서 는 - F 로 구분 기 호 를 설정 할 수 있 습 니 다. 예 를 들 어 아래 파일:# cat group_file2
wireshark:x:987:
usbmon:x:986:
jackuser:x:985:
vboxusers:x:984:allen
aln:x:1001:
# awk -F: '{print $1, $3}' group_file2
wireshark 987
usbmon 986
jackuser 985
vboxusers 984
aln 1001
뒤에 우 리 는 다른 방법 으로 분할 기 호 를 설정 하 는데 그것 이 바로 FS 변 수 를 설정 하 는 것 이다.
awk 도 awk 프로그램 으로 실 행 된 스 크 립 트 파일 을 설명 한 다음 명령 행 에서 awk 로 쓸 수 있 습 니 다. -f xxx. awk filename 호출 실행.Awk 스 크 립 트 파일 은 다음 과 같 습 니 다.
#!/bin/awk
BEGIN {
print "============begin=========="
}
{
print "++++++++++cmd++++++++++"
}
END {
print "-----------End---------"
}
이 스 크 립 트 를 다음 과 같이 호출 합 니 다:
# awk -f begin_cmd.awk group_file1
============begin==========
++++++++++cmd++++++++++
++++++++++cmd++++++++++
++++++++++cmd++++++++++
++++++++++cmd++++++++++
++++++++++cmd++++++++++
-----------End---------
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.