셸 텍스트 필터 프로 그래 밍 (2): awk 의 기초

4930 단어
[저작권 성명: 전재 출처: blog. csdn. net/gentleliu. Mail: shallnew at 163 dot. com]
    이전 절 에 서 는 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---------
 

좋은 웹페이지 즐겨찾기