텍스트 처리 삼 총사 awk 사용

9134 단어
1、awk
awk 는 linux / unix 에서 텍스트 와 데 이 터 를 처리 하 는 프로 그래 밍 언어 입 니 다.데 이 터 는 표준 입력, 하나 이상 의 파일 또는 다른 명령 의 출력 에서 나 올 수 있 습 니 다.awk 는 함수, 정규 표현 식, 배열 등 선진 적 인 기능 을 지원 합 니 다.
awk 에서 텍스트 와 데 이 터 를 처리 하 는 방식 은 먼저 한 줄 한 줄 씩 파일 을 스 캔 하고 첫 줄 부터 마지막 줄 까지 일치 하 는 특정한 패턴 의 줄 을 찾 아 찾 은 줄 에서 세그먼트 작업 을 하 는 것 입 니 다.지정 한 처리 동작 이 없 으 면 일치 하 는 줄 을 표준 출력 (화면) 에 표시 합 니 다. 지정 한 모드 가 없 으 면 모든 작업 이 지정 한 줄 이 처 리 됩 니 다. 명령 행 에서 사용 할 수 있 고 스 크 립 트 의 일부분 으로 사용 할 수 있 습 니 다.
2. awk 의 변수
(1) awk 의 내장 변수
FS (input field seperator): 입력 할 때 필드 구분자, 기본 값 은 공백 문자 입 니 다.역할 동 - F 매개 변수
OFS (output field seperator): 출력 시 필드 구분자, 기본 값 은 공백 문자 입 니 다.
RS (input record seperator): 입력 할 때의 줄 바 꾸 기;
ORS (output record seperator): 출력 할 때의 줄 바 꾸 기;
NF (number of field): 필드 개수
NR (number of record): 줄 수;여러 파일 과 하나의 파일 로 취급 합 니 다.
FNR: 각 파일 은 각각 계산 하고 줄 수 를 계산 합 니 다.
FILENAME: 현재 파일 이름;
ARGC: 명령 행 인자 의 개수;
ARGV: 배열 은 명령 행 이 지정 한 매개 변 수 를 저장 합 니 다.
# FS   ,   -F
[root@node02 ~]# awk -v FS=':' '{print $1}' /etc/passwd|head -2
root
bin
[root@node02 ~]# awk -F: '{print $1}' /etc/passwd|head -2
root
bin
#       \t,    #
[root@node02 ~]# head -2 /etc/passwd|awk -F: -v OFS="\t" -v ORS='#' '{print $1,$3}'
root       0#bin    1
# NF         ,$NF         
[root@node02 ~]# awk -F: '{print NF}' /etc/passwd|head -2
7
7
[root@node02 ~]# awk -F: '{print $NF}' /etc/passwd|head -2
/bin/bash
/sbin/nologin
#                 
[root@node02 ~]# awk '{print FILENAME}' /etc/fstab  /etc/passwd
/etc/fstab
. . . . . .
/etc/passwd
#             
[root@node02 ~]# awk '{print ARGC}' /etc/fstab  /etc/passwd
3
3
. . . . . .
#           
[root@node02 ~]# awk 'BEGIN{print ARGC}' /etc/fstab  /etc/passwd
3
#        , 0    awk  
[root@node02 ~]# awk 'BEGIN{print ARGV[0]}' /etc/fstab  /etc/passwd
awk

(2) awk 의 내장 변수
Awk 에서 변 수 를 사용자 정의 할 때 - v 옵션 을 통 해 변 수 를 사용자 정의 하 는 동시에 program 에서 직접 정의 할 수 있 습 니 다.
[root@node02 ~]# awk -v test="hello awk" 'BEGIN{print test}' /etc/fstab
hello awk
[root@node02 ~]# awk 'BEGIN{test="awk";print test}'
awk

3. awk 에서 printf 출력 명령 의 사용
Awk 에서 printf 도 출력 입 니 다. print 출력 에 비해 print 는 자동 으로 줄 을 바 꾸 지 않 습 니 다. 줄 바 꾸 기 제어 자 를 명시 해 야 합 니 다. "FORMAT 는 다음 아 이 템 마다 포맷 기 호 를 지정 해 야 합 니 다.
(1) printf 출력 을 사용 할 때의 형식 문자
% c: 문 자 를 표시 하 는 ASCII 코드;
% d,% i: 10 진수 보이 기;
% e,% E: 과학 계수 법 수치 표시;
% f: 부동 소수점 으로 표시 하기;
% g,% G: 과학 계수 법 이나 부동 소수점 으로 수 치 를 표시 합 니 다.
% s: 문자열 보이 기;
% u: 부호 없 는 정수;
%%:% 자신 표시;
(2) printf 출력 을 사용 할 때의 장식 문자
\ # [. \ #]: 첫 번 째 숫자 로 표시 되 는 폭 을 제어 합 니 다.두 번 째 \ # 소수점 뒤의 정 도 를 나타 낸다.
-: 왼쪽 정렬
+: 수치 표시 기호
#          
[root@node02 ~]# awk -F: '{printf "%s",$3}' /etc/passwd
01234567811121499192819997489998322965534997996995994993
#   
[root@node02 ~]# awk -F: '{printf "username: %s \t uid:%d
",$1,$3}' /etc/passwd|head -2 username: root       uid:0 username: bin        uid:1 #  15 [root@node02 ~]# awk -F: '{printf "username: %-15s \t uid:%d
",$1,$3}' /etc/passwd| head -3 username: root                 uid:0 username: bin                  uid:1

4. awk 에서 산술 연산 자
연산 자
묘사 하 다.
= += -+ *= /= %= ^= **=
할당 문
||    &&
논리
~    !~
일치 하면 정규 표현 식 과 일치 하지 않 는 정규 표현 식
< <= > >= != ==
관계 연산 자
+ - * / & ** ++ --
산술 연산 자
$
필드 참조
스페이스 바
문자열 연결 문자
?:
삼 목 연산 자
ln
배열 에 키 가 있 는 지 여부
#        
[root@node02 ~]# awk -F: '$3==0 || $3>=1000 {print $1,$3}' /etc/passwd
root 0
nfsnobody 65534
#            
[root@node02 ~]# awk -F: '{$3>=1000||$3==0?usertype="common user":usertype="system user";print$1,"-->"usertype}' /etc/passwd
root -->common user
bin -->system user

5. awk 의 패턴 일치
(1) empty: 빈 모드 로 줄 마다 일치 합 니 다.
(2) / regular expression /: 이 모드 에 맞 는 줄 만 처리 합 니 다.
(3) 관계 표현 식;결 과 는 '진짜' 가 있 고 '가짜' 가 있다.결 과 는 '진' 이 어야 처리 된다.결 과 는 0 값 이 아 닌 빈 문자열 입 니 다.
(4) 줄 범위 의 일치, 직접 숫자 를 드 리 는 형식 은 지원 되 지 않 습 니 다.
(5) BEGIN / END 모드, BEGIN {} 은 파일 의 텍스트 를 처리 하기 전에 한 번 만 실행 합 니 다.END {} 텍스트 처리 가 끝 난 후에 만 실행 합 니 다.
#   fstab    UUID /dev    
[root@node02 ~]# awk '/^UUID|^\/dev/{print $1}' /etc/fstab
/dev/mapper/centos-root
UUID=8dcf68e6-ba4c-4aaa-abd9-d008f1ecbe51
#   uid  1000   
[root@node02 ~]# awk -F: '$3>=1000{print $1,$3}' /etc/passwd
nfsnobody 65534
#   bash /bin/bash   
[root@node02 ~]# awk -F: '$NF=="/bin/bash"{print $1,$3,$NF}' /etc/passwd
root 0 /bin/bash
#       
[root@node02 ~]# awk -F: '(NR>=2&&NR<=4){print $1}' /etc/passwd
bin
daemon
adm
# BEGIN/END    
[root@node02 ~]# awk -F: 'BEGIN{print "username\t\tuid
------------------"}{printf "%s\t\t\t%d
",$1,$3}END{print "=================================
end"}' /etc/passwd|head -5 username           uid ------------------ root                        0 bin                         1 daemon                      2

6. awk 에서 제어 문 구 를 사용 합 니 다.
       awk 의 조건 문 구 는 C 언어 에서 참고 한 것 으로 프로그램 을 제어 할 수 있 는 절차 입 니 다.
(1) if - else 문장
문장 형식: if (condition) statement [else statement]
#   bash “/bin/bash”   
[root@node02 ~]# awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
root
#       
[root@node02 ~]# awk -F: '{if($3>=1000) {printf "Commonuser: %s
",$1} else if($3==0){printf "admin-user: %s
",$1}  else {printf "Sysuser: %s
",$1}}' /etc/passwd admin-user: root Sysuser: bin #  5 [root@node02 ~]# awk '{if(NF>5) print $0}' /etc/fstab # Created by anaconda on Fri Jan  4 01:49:11 2019 # Accessible filesystems, by reference, are maintained under #  10% [root@node02 ~]# df -h | awk -F[%] '/^\/dev/{print $1}' | awk '{if($NF>=10) print $1}' /dev/sda1

(2) while 문장
       While 문 구 는 조건 이 성립 될 때 순환 에 들 어가 고 조건 이 성립 되 지 않 을 때 순환 을 내 놓 으 며 한 줄 안의 여러 필드 를 유사 하 게 처리 할 때 나 배열 의 각 요 소 를 하나씩 처리 하 는 데 자주 사용 된다.
#   liunx           
[root@node02 ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-862.el7.x86_64 30
root=/dev/mapper/centos-root 28
#   liunx                  7      
[root@node02 ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-862.el7.x86_64 30
root=/dev/mapper/centos-root 28

(3) for 문장
#        for     
[root@node02 ~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) if(length($i)>=7){print $i,length($i)}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-862.el7.x86_64 30
root=/dev/mapper/centos-root 28

(4) 기타 제어 문
       위 에서 자주 사용 하 는 제어 문 구 를 제외 하고 다른 제어 문 구 는 do - while 순환, switch 문, break 와 continue, next (앞에서 본 줄 에 대한 처 리 를 끝내 고 다음 줄 로 직접 들 어 갑 니 다) 도 있 습 니 다.
7. awk 의 배열
       awk 의 배열 아래 표 시 는 숫자 와 알파벳 으로 관련 배열 이 라 고 할 수 있 습 니 다.아래 표 시 는 임의의 문자열 을 사용 할 수 있 습 니 다.문자열 은 더 블 따옴표 를 사용 해 야 합 니 다.한 배열 요소 가 사전에 존재 하지 않 으 면 인용 할 때 awk 는 자동 으로 이 요 소 를 만 들 고 그 값 을 '빈 문자열' 로 초기 화 합 니 다.
#                    
[root@node02 ~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'
Tuesday
Monday
#     TCP     
[root@node02 ~]# netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) { print i,state[i]}}'
LISTEN 19
ESTABLISHED 24
TIME_WAIT 3
#   fstab               
[root@node02 ~]# awk '/^UUID|^\/dev/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab
swap 1
xfs 2
#   fstab          
[root@node02 ~]#  awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
swap 2
fstab(5), 1

8. awk 의 함수
       awk 에서 자주 사용 하 는 내장 함수:
              rand (): 0 과 1 사이 의 무 작위 수 를 되 돌려 줍 니 다.
              length ([s]): 지정 한 문자열 의 길 이 를 되 돌려 줍 니 다.
 sub (r, s, [t]): r 가 표시 하 는 모드 로 t 가 표시 하 는 문자 에 일치 하 는 내용 을 찾 고 s 가 표시 하 는 내용 으로 처음 나타 납 니 다.
 gsub (r, s, [t]): r 가 표시 하 는 모드 로 t 가 표시 하 는 문자 의 일치 하 는 내용 을 찾 고 모든 출현 을 s 가 표시 하 는 내용 으로 대체 합 니 다.
 split (s, a [, r]): r 를 구분자 로 하여 문자 s 를 자 르 고 자 른 결 과 를 a 가 표시 하 는 배열 에 저장 합 니 다.
#         ip  tcp     
[root@node02 ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
192.168.17.195 1
192.168.17.196 3
#         root   admin
[root@node02 ~]# awk -F: '{ sub(/root/, "admin"); print }' /etc/passwd
admin:x:0:0:root:/root:/bin/bash

다음으로 전송:https://blog.51cto.com/dayi123/2366999

좋은 웹페이지 즐겨찾기