SHELL - 텍스트 처리 (3): sed 와 awk

9223 단어 학습 노트
명령
  • sed (stream editor) 처리 메커니즘:
  •         일부 줄 을 지정 할 수 있 습 니 다.
            sed 한 줄 의 내용 을 처리 할 때 현재 처 리 된 줄 을 임시 버퍼 에 저장 하 는 것 을 '모드 공간' 이 라 고 합 니 다.
            처리 가 끝 난 후 버퍼 의 내용 을 화면 으로 보 낸 다음 다음 줄 의 내용 을 처리 합 니 다.
                 
  • 상용 매개 변수:
  • sed [  ] '  ' file
    	p	##  ,           
            d	##  ,       
    	a	##  , a       ,                    
    	c	##  ,c       ,               
    	i	##  ,i       ,                

     
    -i         ##       
  • p    ##표시
  • [root@localhost mnt]# cat -n /etc/fstab 
         1	
         2	#
         3	# /etc/fstab
         4	# Created by anaconda on Wed May  7 01:22:57 2014
         5	#
         6	# Accessible filesystems, by reference, are maintained under '/dev/disk'
         7	# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
         8	#
         9	UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    [root@localhost mnt]# sed -n '/\:/p' /etc/fstab      ##      :  
    # Created by anaconda on Wed May  7 01:22:57 2014
    [root@localhost mnt]# sed -n '/^#/p' /etc/fstab     ##     #  
    #
    # /etc/fstab
    # Created by anaconda on Wed May  7 01:22:57 2014
    #
    # 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
    #
    [root@localhost mnt]# sed -n '/^#/!p' /etc/fstab    ##    #    
    
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    [root@localhost mnt]# sed -n '2,6p' /etc/fstab    ##  2 6   
    #
    # /etc/fstab
    # Created by anaconda on Wed May  7 01:22:57 2014
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    [root@localhost mnt]# sed -n '2,6!p' /etc/fstab    ##  2 6      
    
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    
  • d     ##삭제
  • sed '/^UUID/d' /etc/fstab     ##   UUID     
    sed '/^#/d' /etc/fstab        ##   #    
    sed '/^$/d' /etc/fstab        ##    
    sed '1,4d' /etc/fstab         ##         
  • a   ##추가
  • [root@localhost mnt]# vim westos
    [root@localhost mnt]# cat westos 
    hello
    [root@localhost mnt]# sed '/hello/aworld' westos    ## hello        world
    hello
    world
    [root@localhost mnt]# sed 's/hello/hello world/g' westos    ##    hello   world
    hello world
    [root@localhost mnt]# sed 's/hello/hello
    world/g' westos ## hello world hello world
  • c  ##교체
  • [root@localhost mnt]# sed '/hello/chello world' westos   ## hello      hello world
    hello world
    
  • i   ##삽입
  • [root@server mnt]# sed '/hello/iworld
    westos' westos ## hello world westos world westos hello
  • -i     ##원본 파일 내용 변경
  • 연습:
    httpd 서비스의 포트 를 8080 으로 변경 합 니 다.
    [root@localhost mnt]# vim http.sh
    [root@localhost mnt]# cat http.sh 
    #!/bin/bash
    yum install httpd -y &> /dev/null
    sed -i "/^Listen/cListen $1" /etc/httpd/conf/httpd.conf && echo -e "Port changed $1 success"
    systemctl restart httpd
    [root@localhost mnt]# sh http.sh 8080
    Port changed 8080 success
    [root@localhost mnt]# vim http.sh
    [root@localhost mnt]# sh http.sh 80
    Port changed 80 success
    

    명령
    1. awk 처리 메커니즘:
  • awk 는 텍스트 처리 에 사용 되 고 데이터 추출 과 보고 도구 로 사용 되 는 해석 적 프로 그래 밍 언어
  • 입 니 다.
  • 패턴 에 따라 파일 에서 한 줄 의 텍스트 를 추출 하여 이 줄 의 텍스트 를 슬라이스 합 니 다 (기본 값 은 공백 문 자 를 구분자 로 사용 합 니 다)
  • [root@localhost mnt]# cat test this     | is   | a  | file  $1     $2  $3    $4
    [root@localhost mnt]# vim test
    [root@localhost mnt]# cat test
    this is a file
    [root@localhost mnt]# awk '{print $0}' test
    this is a file
    [root@localhost mnt]# awk '{print $1}' test
    this
    [root@localhost mnt]# awk '{print $2}' test
    is
    [root@localhost mnt]# awk '{print $3}' test
    a
    [root@localhost mnt]# awk '{print $4}' test
    file
    
  • -F    ##이 매개 변 수 는 구분자 가 무엇 인지 표시 합 니 다
  • [root@localhost mnt]# awk -F ":" '{print $1,$3}' /etc/passwd   ## :    ,   1       
    root 0
    bin 1
    daemon 2
    adm 3
    lp 4
    sync 5
    shutdown 6
    halt 7
    

    2. awk 상용 변수
     
  • 파일 이름과 줄 번호 인쇄
  • [root@localhost mnt]# awk '{print FILENAME,NR}' /etc/passwd   ##        
    /etc/passwd 1
    /etc/passwd 2
    /etc/passwd 3
    /etc/passwd 4
    /etc/passwd 5
    /etc/passwd 6
    /etc/passwd 7
    /etc/passwd 8
    /etc/passwd 9
    /etc/passwd 10
    /etc/passwd 11
    /etc/passwd 12
    /etc/passwd 13
    
  • 줄 번호 와 필드 수량 인쇄
  • [root@localhost mnt]# awk -F: '{print NR,NF}' /etc/passwd  ## :    ,         
    1 7
    2 7
    3 7
    4 7
    5 7
    6 7
    7 7
    8 7
    9 7
    10 7
    11 7
    12 7
    

     
  • /bash 로 끝 나 는 줄 인쇄
  • [root@localhost mnt]# awk -F: '/bash$/{print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    student:x:1000:1000:Student User:/home/student:/bin/bash
    
  • 세 번 째 줄 인쇄
  • [root@localhost mnt]# awk -F: 'NR==3 {print}' /etc/passwd
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    
  • 짝수 줄 인쇄
  • [root@localhost mnt]# awk -F: 'NR % 2 ==0 {print}' /etc/passwd
    bin:x:1:1:bin:/bin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    halt:x:7:0:halt:/sbin:/sbin/halt
    operator:x:11:0:operator:/root:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
    rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
    
  • 세 번 째 줄 에서 다섯 번 째 줄 까지 인쇄
  • [root@localhost mnt]# awk -F: 'NR >=3 && NR<=5 {print}' /etc/passwd
    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
    
  • uid 의 작은 크기 와 같은 사용자 이름과 uid
  • 를 인쇄 합 니 다.
    [root@localhost mnt]# awk -F: '$3 >=0 && $3 <=2 {print $1,$3}' /etc/passwd
    root 0
    bin 1
    daemon 2
    

    3. awk 의 BEGIN 과 END 용법
  • BEGIN {}: 첫 번 째 줄 의 텍스트 를 읽 기 전에 실 행 된 문 구 는 보통 초기 화 작업 에 사 용 됩 니 다. {}: 한 줄 씩 처리 합 니 다
  • END {}: 마지막 줄 텍스트 를 처리 한 후 실행 합 니 다. 출력 결 과 를 처리 하 는 데 사 용 됩 니 다
  • 연습:
  • 파일 을 인쇄 하기 전에 시작 과 끝 에 지정 한 문 자 를 추가 합 니 다
  • [root@localhost mnt]# awk -F: 'BEGIN{print "REDHAT"} {print NR;print } END {print "WESTOS"}' passwd    ##     REDHAT,   WESTOS,       
    REDHAT
    1
    root:x:0:0:root:/root:/bin/bash
    2
    bin:x:1:1:bin:/bin:/sbin/nologin
    ...
    39
    tcpdump:x:72:72::/:/sbin/nologin
    40
    apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    WESTOS
    [root@localhost mnt]# 
    

     
  • 통계 텍스트 총 필드 수량
  • [root@localhost mnt]# cat linux.txt 
    123
    123 12
    
    12
    12 12 123
    [root@localhost mnt]# awk 'BEGIN{i=0}{i+=NF}END{print i}' linux.txt   ##      
    7
    [root@localhost mnt]# 
    

    4. awk 의 고급 응용 프로그램 (if, for, while)
    1) if 단일 분기 문
    [root@localhost mnt]# awk -F: 'BEGIN{i=0}{if($7~/bash$/){i++}}END{print i}' /etc/passwd  ##    shell bash   
    2
    
    

    2) if 두 갈래 문장
    [root@localhost mnt]# awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd   ##  uid    500   500     
    31 9
    

    3) 순환 을 위 한
    [root@localhost mnt]# awk 'BEGIN{for(i=1;i<=5;i++){print i}}'   ##  1 5
    1
    2
    3
    4
    5
    

    4) while 순환
    [root@localhost mnt]# awk 'i=1 {} BEGIN {while (i<3) {i++;print i}}' test.sh   ##  1 3   ,     
    1
    2
    3
    [root@localhost mnt]# 
    [root@localhost mnt]# awk 'BEGIN {do {++i;print i} while (i<3)}' test.sh
    1
    2
    3
    

    연습:
  • 내장 순환
  • [root@localhost mnt]# cat qiantao.sh 
    #!/bin/bash
    
    for((a=1;a<=3;a++))
    do
        echo "Starting outside loop: $a"
        for((b=1;b<=3;b++))
        do
            echo "Inside loop: $b"
        done
    done
    [root@localhost mnt]# sh qiantao.sh 
    Starting outside loop: 1
    Inside loop: 1
    Inside loop: 2
    Inside loop: 3
    Starting outside loop: 2
    Inside loop: 1
    Inside loop: 2
    Inside loop: 3
    Starting outside loop: 3
    Inside loop: 1
    Inside loop: 2
    Inside loop: 3
    
  • 9 * 9 곱셈 표 생 성
  • [root@localhost mnt]# vim 99.sh
    [root@localhost mnt]# cat 99.sh 
    #!/bin/bash
    
    ##  9*9   
    #1*1=1
    #2*1=2 2*2=4
    #3*1=3 3*2=6 3*3=9
    
    for i in $(seq 9)
    do
        for j in $(seq $i)
            do
                echo -ne "$i*$j=$(($i*$j))\t"
            done
        echo -e "
    " done [root@localhost mnt]# sh 99.sh 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 [root@localhost mnt]#

    좋은 웹페이지 즐겨찾기