정규 표현 식 (2) awk
정규 표현 식 온라인 테스트 도구:https://c.runoob.com/front-end/854
awk 도구 사용
위 에서 도 awk 는 sed 와 마찬가지 로 스 트림 편집기 라 고 언급 했 습 니 다. 문서 의 줄 을 대상 으로 작 동 하고 한 줄 한 줄 실행 합 니 다.awk 는 sed 보다 더 강하 다. sed 가 할 수 있 는 것 도 할 수 있 고 sed 가 할 수 없 는 것 도 할 수 있다.awk 도 구 는 사실 매우 복잡 하 다. 전문 적 인 책 으로 그의 응용 을 소개 하지만 아 밍 은 그렇게 복잡 하 게 배 울 필요 가 없다 고 생각한다. 일상적인 관리 업무 중의 문 제 를 처리 할 수만 있다 면 된다.왜 자신의 머리 에 그런 물건 을 담아 자신 을 난처 하 게 합 니까?사용 하 는 것 도 많 지 않 으 니까 지금 많이 가르쳐 주 더 라 도 배 웠 어 요. 오래 걸 리 지 않 으 면 잊 어 버 릴 거 예요.이 를 감안 하여 아 밍 은 흔히 볼 수 있 는 awk 응용 만 소개 하고 관심 이 있다 면 더 깊이 연구 하 세 요.
문서 의 한 단락 을 캡 처 합 니 다.
[root@localhost ~]# head -n2 /etc/passwd |awk -F ':' '{print $1}'
root
bin
설명 하 자 면, - F 옵션 의 역할 은 구분 자 를 지정 하 는 것 입 니 다. - F 를 추가 하지 않 으 면 빈 칸 이나 tab 를 구분자 로 합 니 다.인쇄 동작 으로 필드 를 인쇄 합 니 다.1 은 첫 번 째 필드 이 고, 1 은 첫 번 째 필드 이 며, 2 는 두 번 째 필드 이 며, 순서대로 유추 합 니 다. 하나의 특수 한 것 은 $0 입 니 다. 이것 은 전체 줄 을 표시 합 니 다.
[root@localhost ~]# head -n2 test.txt |awk -F':' '{print $0}'
rto:x:0:0:/rto:/bin/bash
operator:x:11:0:operator:/roto:/sbin/nologin
awk 형식 에 주의 하 십시오. - F 후 따옴표 에 바짝 붙 어 있 고 그 안 에는 구분자 가 있 습 니 다. print 의 동작 은 {} 로 묶 어야 합 니 다. 그렇지 않 으 면 잘못 보 고 됩 니 다.print 는 사용자 정의 내용 도 인쇄 할 수 있 지만 사용자 정의 내용 은 작은 따옴표 로 묶 어야 합 니 다.
[root@localhost ~]# head -n2 test.txt |awk -F':' '{print $1"#"$2"#"$3"#"$4}'
rto#x#0#0
operator#x#11#0
일치 하 는 문자 나 문자열
[root@localhost ~]# awk '/oo/' test.txt
operator:x:11:0:operator:/rooto:/sbin/nologin
roooto:x:0:0:/rooooto:/bin/bash
sed 와 비슷 하 죠? 하지만 sed 보다 더 강 한 매 칭 이 있 습 니 다.
[root@localhost ~]# awk -F ':' '$1 ~/oo/' test.txt
roooto:x:0:0:/rooooto:/bin/bash
어떤 단락 을 일치 시 킬 수 있 습 니 다. 여기 '~' 는 일치 한 다 는 뜻 입 니 다. 계속 내 려 다 보 세 요.
[root@localhost ~]# awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' /etc/passwd
root 0
operator 11
test 511
test1 512
awk 는 또한 여러 번 일치 할 수 있 습 니 다. 예 를 들 어 루트 가 일치 하고 test 와 일치 하 며 일치 하 는 세그먼트 만 인쇄 할 수 있 습 니 다.
조건 조작 부호
[root@localhost ~]# awk -F ':' '$3=="0"' /etc/passwd
root:x:0:0:root:/root:/bin/bash
awk 에 서 는 논리 적 기호 로 판단 할 수 있 습 니 다. 예 를 들 어 '=' 은 같 고 '정확 한 일치' 라 고 이해 할 수 있 습 니 다. 그리고 '> ='
[root@localhost ~]# awk -F ':' '$3>="500"' /etc/passwd
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
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
user11:x:510:502:user11,user11's office,12345678,123456789:/home/user11:/sbin/nologin
test:x:511:511::/home/test:/bin/bash
test1:x:512:511::/home/test1:/bin/bash
위의 예 에서 uid 가 500 이상 인 줄 을 인쇄 하려 고 했 지만 결 과 는 우리 가 예상 한 것 이 아니 었 습 니 다. 이것 은 awk 가 모든 숫자 를 문자 로 대 했 기 때 문 입 니 다. 지난 장 에서 언급 한 sort 정렬 원리 와 같 습 니 다.
[root@localhost ~]# awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
test:x:511:511::/home/test:/bin/bash
test1:x:512:511::/home/test1:/bin/bash
!= 일치 하지 않 기 위해 서 는 한 단락 의 문 자 를 논리 적 으로 비교 하 는 것 외 에 두 단락 간 에 논리 적 으로 비교 할 수 있다.
[root@localhost ~]# awk -F ':' '$3
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
또한 & & 와 | | 을 사용 하여 "그리고"또는 "의 뜻 을 나 타 낼 수 있다.
[root@localhost ~]# awk -F ':' '$3>"5" && $3
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
user11:x:510:502:user11,user11's office,12345678,123456789:/home/user11:/sbin/nologin
test:x:511:511::/home/test:/bin/bash
test1:x:512:511::/home/test1:/bin/bash
혹은
[root@localhost ~]# awk -F ':' '$3>"5" || $7=="/bin/bash"' /etc/passwd
root:x:0:0:root:/root:/bin/bash
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
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
user11:x:510:502:user11,user11's office,12345678,123456789:/home/user11:/sbin/nologin
test:x:511:511::/home/test:/bin/bash
test1:x:512:511::/home/test1:/bin/bash
awk 내장 변수
awk 에서 자주 사용 하 는 변 수 는 다음 과 같 습 니 다.
NF: 구분자 로 구분 한 후 모두 몇 단락 이 있 습 니까?
NR: 줄 수
[root@localhost ~]# head -n3 /etc/passwd | awk -F ':' '{print NF}'
7
7
7
[root@localhost ~]# head -n3 /etc/passwd | awk -F ':' '{print $NF}'
/bin/bash
/sbin/nologin
/sbin/nologin
NF 는 몇 단락 이 고 $NF 는 마지막 단락 의 값 이 며 NR 는 줄 번호 입 니 다.
[root@localhost ~]# head -n3 /etc/passwd | awk -F ':' '{print NR}'
1
2
3
우 리 는 줄 번 호 를 판단 조건 으로 사용 할 수 있다.
[root@localhost ~]# awk 'NR>20' /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
user11:x:510:502:user11,user11's office,12345678,123456789:/home/user11:/sbin/nologin
test:x:511:511::/home/test:/bin/bash
test1:x:512:511::/home/test1:/bin/bash
세그먼트 매 칭 과 함께 사용 할 수 있 습 니 다:
[root@localhost ~]# awk -F ':' 'NR>20 && $1 ~ /ssh/' /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
awk
awk 는 세그먼트 값 을 변경 할 수 있 습 니 다:
[root@localhost ~]# head -n 3 /etc/passwd |awk -F ':' '$1="root"'
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
awk 는 각 단락 의 값 을 수학 적 으로 연산 할 수 있 습 니 다.
[root@localhost ~]# head -n2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]# head -n2 /etc/passwd |awk -F ':' '{$7=$3+$4}'
[root@localhost ~]# head -n2 /etc/passwd |awk -F ':' '{$7=$3+$4; print $0}'
root x 0 0 root /root 0
bin x 1 1 bin /bin 2
물론 어떤 단락 의 총화 도 계산 할 수 있다.
[root@localhost ~]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
2891
여기 END 는 모든 줄 이 이미 실행 되 었 음 을 나타 내 는 것 을 주의해 야 합 니 다. 이것 은 awk 특유 의 문법 입 니 다. 사실은 awk 는 sed 와 함께 스 크 립 트 파일 로 쓸 수 있 고 그들 만 의 문법 이 있 습 니 다. awk 에서 if 판단, for 순환 을 사용 하 는 것 은 모두 가능 합 니 다. 다만 아 밍 은 일상 관리 업무 에서 그렇게 복잡 한 문 구 를 사용 할 필요 가 없다 고 생각 할 뿐 입 니 다.
[root@localhost ~]# awk -F ‘:’ ‘{if ( 1=="root")print 1 =="r o o t ") p r i n t 0}’/etc/passwd root:x:0:0:root:/root:/bin/bash
기본적으로 정규 표현의 내용 은 여기까지 다.하지만 이것 은 단지 가장 기본 적 인 것 일 뿐, 언급 하지 않 았 습 니 다. sed 와 awk 를 깊이 있 게 이야기 하지만, 일상적인 업무 의 수 요 를 충분히 만족 시 킬 수 있 습 니 다. 가끔 은 비교적 복잡 한 수 요 를 만 날 수도 있 습 니 다. 만약 에 만 났 다 면 구 글 에 게 물 어보 세 요.다음은 awk 에 관 한 연습 문 제 를 몇 개 내 겠 습 니 다. 열심히 완성 하 시 기 를 바 랍 니 다.
awk test.txt ( awk , test.txt)
‘bash’
‘:’ , 0
‘:’ , ‘root’ , ‘root’ ‘toor’ ( sed )
‘:’ ,
20
‘:’ ,
‘:’ , , ‘@’ ( , 'root@/bin/bash‘ )
‘:’ , ,
awk 연습 문제 답안
전재 하 다http://www.apelearn.com/study_v2/chapter14.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.