텍스트 처리 삼 총사 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.