AWK 진급
PATTERN 모드 가 일치 합 니 다. sed 의 주소 경계 와 유사 하여 요구 에 부 합 된 기록 을 걸 러 냅 니 다.
(1) 기본 값 은 빈 모드 로 줄 마다 일치 합 니 다.
(2) / regular expression /: 패턴 에 맞 는 기록 을 걸 러 내 는 정규 표현 식
(3) relational expression: 관계 표현 식, 여기 결 과 는 불 값 입 니 다. '진짜' 가 있 고 '가짜' 가 있 습 니 다. 결과 가 '진짜' 여야 만 처리 합 니 다.
이곳 의 '진' 은 결과 가 0 이 아니 거나 비어 있 는 것 이 진실 을 나타 내 고 다른 것 은 '가짜' 이다.
예 를 들 어: 도 메 인 구분자 로 표현 식 에 맞 는 줄 을 인쇄 합 니 다.3 달러 가 30 줄 보다 작 아야 인쇄 한 다 는 뜻 입 니 다.
예 를 들 어: 구분자 로 $3 이 1000 이하 이 고 마지막 도 메 인 은 문자열 / bin / bash 줄 이 며 인쇄 합 니 다.
(4) 행 범위 정의
sed, / pat 1 /, / pat 2 / 와 유사 합 니 다.
예 를 들 어 첫 번 째 h 로 시작 하 는 줄 에서 첫 번 째 a 로 시작 하 는 줄 까지 일치 하고 인쇄 합 니 다.
주의: 여 기 는 sed 처럼 직접 숫자 로 정의 할 수 없습니다.
(5) BGEIN / END 모드
BEGIN {} 기록 을 읽 기 전에 한 번 만 실행 합 니 다.
END {} 텍스트 처리 완료 후 한 번 만 실행
[root@centos7 11:18:52 ~]#awk -F: 'BEGIN{print "username UID
---------------------------"}$3<=1000 && $NF=="/bin/bash"{printf "%-15s%d
",$1,$3}END{print "=======================
end"}' /etc/passwd
username UID
---------------------------
root 0
zmh 1000
=======================
end
(6) progranm 에서 자주 사용 하 는 action
a.Expressions
b. 조건 부 제어 문: if, while 등
c. 조합 문
d.inpue statements
e.output statements
(7) 제어 문
if(condition){statments}
if(condition){statments}else{statements}
while(condition){statements}
do{stetements}while(condition)
for(expr1;expr2;expr3){statements}
break
continue
delete array[index]
delete array
exit
제어 문
1.if-else
문법: if (condition) statement [else statement]
[root@centos7 14:50:38 ~]#awk -F: '{if($3<=50&&$3!=0)print}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@centos7 14:54:51 ~]#awk -F: '{if($3<=20){print $1,$3}else{print $1}}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
operator 11
games 12
ftp 14
nobody
systemd-network
dbus
polkitd
abrt
libstoragemgmt
rpc
, if statements {} , if else statement {}
예제, 디스크 사용량 이 지정 한 값 보다 큰 디스크 를 꺼 냅 니 다.
[root@centos7 15:09:30 ~]#df | awk -F% '/^\/dev\/sd/{print $1}'
/dev/sda2 52403200 3876228 48526972 8
/dev/sda3 31441920 354300 31087620 2
/dev/sda1 1038336 161628 876708 16
[root@centos7 15:09:38 ~]#df | awk -F% '/^\/dev\/sd/{print $1}' | awk '{if($NF>=10)print $1,$NF}'
/dev/sda1 16
2. while 순환
문법: shile (condition) statement
조건 은 '진' 이 순환 에 들 어 가 는 것 이다.조건 은 '가짜' 종료 순환 입 니 다.첫 번 째 판단 이 '가짜' 였 다 면 순환 에 들 어가 지 않 았 을 것 이다.
사용 장면: 한 줄 에 있 는 여러 필드 를 하나씩 처리 할 때 사용 합 니 다.배열 의 각 요 소 를 하나하나 처리 하 다.
예 를 들 어, 통계 / opt / httpd - 2.2.34 / README 에서 문자 마다 나타 나 는 횟수 를 집계 하고 문자 와 문자 길이 (length () 함수 참조) 를 출력 합 니 다.
[root@centos7 16:09:53 usr]#awk '{i=1;while(i
3.do-while
:do{statment;...}while(condition) ,
, 1..100
[root@centos7 16:10:13 usr]#awk 'BEGIN{sum=0;i=0;do{sum+=i;i++}while(i<=100){print sum}}'
5050
[root@centos7 16:18:31 usr]#
4. for 순환
문법: for (expr 1; expr 2; expr 3) {statement;...}
배열 요소 옮 겨 다 니 기: for (var in array) {statement}
예 를 들 어 grub. cfg 파일 을 옮 겨 다 니 며 word [] 배열 에 저장 한 다음 배열 요 소 를 옮 겨 다 니 며 값 을 수락 합 니 다. [root@centos7 16:37:01 usr]#awk '{for(i=1;i<=NF;i++){word[$i]++}}END{for(j in word){print j,word[j]}}' /boot/grub2/grub.cfg
insmod 14
savedefault 1
tuned_params="" 1
ro 2
--hint='hd0,msdos1' 2
boot_once=true 2
'gnulinux-3.10.0-693.el7.x86_64-advanced-6aaae4c2-65bf-40c9-a001-8ab05ccbc30d' 1
x"${feature_menuentry_id}" 1
type 1
an 1
/etc/grub.d/41_custom 2
after 1
root='hd0,msdos1' 2
예 를 들 어 서로 다른 방법 으로 1. 1000000 의 합 을 구하 고 time 으로 소모 하 는 시간 을 계산한다. [root@centos7 16:55:55 usr]#time (awk 'BEGIN{sum=0;for(i=0;i<=1000000;i++){sum+=i}print sum}')
500000500000
real 0m0.119s
user 0m0.116s
sys 0m0.004s
[root@centos7 16:55:56 usr]#time (sum=0;for i in {1..1000000};do let sum+=$i;done;echo $sum)
500000500000
real 0m5.864s
user 0m5.685s
sys 0m0.174s
[root@centos7 16:56:08 usr]#time (seq -s "+" 1 1000000|bc)
500000500000
real 0m0.441s
user 0m0.280s
sys 0m0.245s
[root@centos7 16:56:47 usr]#
이상 에서 알 수 있 듯 이 awk 계산 효율 은 셸 보다 훨씬 높다
5. switch 문장
문법: switch (expression) {case VALUE 1 or / REGEXP /: statement 1; case VALUE 2 or / REGEXP /: statement 2;...; default: statement}
6. break 와 continue
예시 [root@centos7 17:09:33 usr]#awk 'BEGIN{sum=0;for(i=0;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}'
2500
[root@centos7 17:11:25 usr]#awk 'BEGIN{sum=0;for(i=0;i<=100;i++){if(i==88)break;sum+=i}print sum,i}'
3828 88
7. next: 본 줄 에 대한 처 리 를 미리 끝내 고 다음 줄 로 바로 들 어가 기 (awk 자체 순환 읽 기 줄 의 순환)
예시 [root@centos7 17:15:05 usr]#awk -F: '{if($3%2==1)next;print $1,$3,NR}' /etc/passwd
root 0 1
daemon 2 3
lp 4 5
shutdown 6 7
mail 8 9
games 12 11
ftp 14 12
systemd-network 192 14
libstoragemgmt 998 18
rpc 32 19
saslauth 996 21
rtkit 172 22
nfsnobody 65534 26
geoclue 994 29
gdm 42 33
gnome-initial-setup 992 34
sshd 74 35
avahi 70 36
ntp 38 38
tcpdump 72 39
zmh 1000 40
docker 1002 42
base 1004 44
testbash 1006 46
nologin 1008 47
apache 48 49
user1 1010 50
awk 배열
awk 의 배열 은 모두 관련 배열 입 니 다. array [index - expression]
index-expression:
(1) 임의의 문자열 을 사용 할 수 있 습 니 다.문자열 은 두 따옴표 로 묶 어야 한다.
(2) 특정한 배열 요소 가 사전에 존재 하지 않 으 면 인용 할 때 awk 는 자동 으로 이 요 소 를 만 들 고 '빈' 으로 초기 화 합 니 다.
배열 에 어떤 요소 가 존재 하 는 지 판단 하려 면 "index in array" 형식 으로 배열 을 옮 겨 다 닙 니 다.
예시, array [$0] 가 사전에 존재 하지 않 습 니 다. awk 가 자동 으로 생 성하 고 값 을 비 웠 습 니 다. 다시!반전 값 을 1 로 표시 하고 기본 {print $0} 을 실행 합 니 다. [root@centos7 18:44:47 usr]#awk '!arr[$0]' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Mar 28 02:08:30 2018
# Created by anaconda on Wed Mar 28 02:08:30 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=6aaae4c2-65bf-40c9-a001-8ab05ccbc30d / xfs defaults 0 0
UUID=1e010872-4180-4ce5-be38-4152a4f302e5 /boot xfs defaults 0 0
UUID=66f9e8a4-7d65-4ced-8bd9-f76e5e7b97d6 /data xfs defaults 0 0
UUID=af954884-fc86-4450-9c1d-342531c53c7b swap swap defaults 0 0
/dev/sr0 /data/mnt/6/x86_64/ iso9660 defaults 0 0
/dev/sr1 /data/mnt/7/x86_64/ iso9660 defaults 0 0
[root@centos7 18:44:53 usr]#
배열 의 모든 요 소 를 옮 겨 다 니 려 면 for 순환 을 사용 해 야 합 니 다.for(var in array){for-body}
메모: var 는 array 의 모든 색인 을 옮 겨 다 닙 니 다.
예 를 들 어 tcp 로 시작 하 는 네트워크 포트 상 태 를 선택 하고 state [] 배열 에 저장 한 다음 for 를 사용 하여 배열 을 옮 겨 다 니 며 배열 색인 (즉 포트 상태) 을 인쇄 합 니 다. 배열 요소 (즉 같은 상태 개수) 와 같 습 니 다. [root@centos7 18:44:53 usr]#netstat -tan | awk '/^tcp/{state[$NF]++}END {for(i in state) { print i,state[i]}}'
LISTEN 9
ESTABLISHED 1
awk 함수
수치 처리 함수
rand (): 0 과 1 사이 의 무 작위 수 를 되 돌려 줍 니 다.
예시 [root@centos7 18:57:55 usr]#awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'
13
92
18
63
39
4
42
12
18
92
문자 처리 함수:
length ([s]): 지정 한 문자열 의 길 이 를 되 돌려 줍 니 다.
sub (r, s, [t]): t 문자열 에 대해 r 가 표시 하 는 패턴 과 일치 하 는 내용 을 검색 하고 첫 번 째 일치 하 는 내용 을 s 로 대체 합 니 다. [root@centos7 18:57:56 usr]#awk 'sub(/:/,"---",$1)' /etc/passwd
root---x:0:0:root:/root:/bin/bash
bin---x:1:1:bin:/bin:/sbin/nologin
daemon---x:2:2:daemon:/sbin:/sbin/nologin
adm---x:3:4:adm:/var/adm:/sbin/nologin
lp---x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync---x:5:0:sync:/sbin:/bin/sync
[root@centos7 19:02:17 usr]#awk 'gsub(/:/,"---",$1)' /etc/passwd
root---x---0---0---root---/root---/bin/bash
bin---x---1---1---bin---/bin---/sbin/nologin
daemon---x---2---2---daemon---/sbin---/sbin/nologin
adm---x---3---4---adm---/var/adm---/sbin/nologin
lp---x---4---7---lp---/var/spool/lpd---/sbin/nologin
sync---x---5---0---sync---/sbin---/bin/sync
gsub (r, s, [t]): t 문자열 에 대해 r 가 표시 하 는 패턴 과 일치 하 는 내용 을 검색 하고 모두 s 가 표시 하 는 내용 으로 대체 합 니 다.
split (s, array, [r]): r 를 구분자 로 하고 문자열 s 를 절단 하 며 절 단 된 결 과 를 array 가 표시 하 는 배열 에 저장 합 니 다. 첫 번 째 색인 값 은 1 이 고 두 번 째 색인 값 은 2 입 니 다.
예시 [root@centos7 19:06:50 usr]#netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
192.168.30.1 1
0.0.0.0 4
사용자 정의 함수
형식: function name ( parameter, parameter,...){ statements
return expression }
예: a, b 의 크기 비교 cat fun.awk
function max(v1,v2){
v1>v2?var=v1:var=v2
return var }
BEGIN{a=3;b=2;print max(a,b)} awk –f fun.awk
awk -f fun.awk
예 를 들 어 남자 (m) 의 평균 성적, 여자 (f) 의 평균 성적 을 구한다. [root@centos7 19:15:56 bin]#cat score.txt
leifeng 100 m
lilei 99 m
limengmeng 90 f
han××× 100 f
[root@centos7 19:16:07 bin]#awk '{num[$NF]++;sum[$NF]+=$2 }END{for(sex in num)printf "%s:%.2f
",sex,sum[sex]/num[sex]}' score.txt
m:99.50
f:95.00
[root@centos7 19:16:09 bin]#
awk 에서 셸 명령 호출
시스템 명령, 빈 칸 은 awk 의 문자열 연결 문자 입 니 다. 시스템 에서 awk 의 변 수 를 사용 해 야 한다 면 빈 칸 으로 구분 하거나 awk 변 수 를 제외 한 다른 변 수 는 일률적으로 "참조" 를 사용 할 수 있 습 니 다.
예시 [root@centos7 19:16:09 bin]#awk 'BEGIN{score=100; system("echo your score is " score) }'
your score is 100
awk 스 크 립 트 에 인자 전달
형식: awkfile var=value var2=value2... Inputfile 메모: BEGIN 과정 에서 사용 할 수 없습니다. 첫 줄 의 입력 이 끝 난 후에 야 변 수 를 사용 할 수 있 습 니 다. - v 매개 변 수 를 통 해 awk 가 BEGIN 을 실행 하기 전에 변 수 를 가 져 올 수 있 습 니 다. 명령 줄 에 지정 한 변 수 는 각각 - v 매개 변수 가 필요 합 니 다. 예시 [root@centos7 19:25:23 bin]#cat test.awk
#!/bin/awk -f
{if($3 >=min && $3<=max)print $1,$3}
[root@centos7 19:25:26 bin]#chmod +x test.awk
[root@centos7 19:25:31 bin]#test.awk -F: min=100 max=200 /etc/passwd
systemd-network 192
abrt 173
rtkit 172
qemu 107
usbmuxd 113
pulse 171
[root@centos7 19:25:33 bin]#
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.