정규 표현 식 (2) awk

26194 단어 shelllinux
정규 표현 식 (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 연습 문제 답안
  • awk ‘{print $0}’ test.txt
  • awk ‘/bash/’ test.txt
  • awk -F’:’ ‘$3==”0”’ test.txt
  • awk -F’:’ ‘$1==”root”’ test.txt |sed ‘s/root/toor/’
  • awk -F’:’ ‘{print $NF}’ test.txt
  • awk -F’:’ ‘NR>20’ test.txt
  • awk -F’:’ ‘ 3< 3 < 4’ test.txt
  • awk -F’:’ ‘{print 1"@" 1 "@ "NF}’ test.txt
  • awk -F’:’ ‘{(sum+=$4)}; END {print sum}’ test.txt

  • 전재 하 다http://www.apelearn.com/study_v2/chapter14.html

    좋은 웹페이지 즐겨찾기