2. 정규

5322 단어 shell
[TOC]
하루
1. 무엇이 정칙 인가
  • 정규 적 인 안 부 꼬치
  • 정규 를 잘 파악 하면 셸 스 크 립 트 를 작성 하 는 데 큰 도움 이 됩 니 다
  • 명 프로 그래 밍 언어 에는 모두 정규 가 있 고 원 리 는 같다
  • .
  • 이 장 에 서 는 grep/egrep, sed, awk (egrep 는 grep 의 확장)
  • 를 배 울 것 이다.
    2.grep
  • grep [-cinvABC] 'word' filename
  • - c 줄 수
  • - i 대소 문자 구분 없 음
  • - n 줄 번호 표시
  • - v 취 반
  • - r 모든 하위 디 렉 터 리 옮 겨 다 니 기
  • - A 뒤에 숫자 를 따라 요구 에 부 합 된 줄 과 아래 n 줄 을 걸 러 냅 니 다
  • - B 는 위 에서 요구 에 부합 되 는 줄 과 위 n 줄 을 걸 러 낸다
  • - C 는 위 와 같이 요구 에 부합 되 는 줄 과 상하 각 n 줄 을 걸 러 낸다.
  • 데모
  • [root@localhost grep]# grep -c 'root' passwd 
    2
    [root@localhost grep]# grep -n 'root' passwd 
    1:root:x:0:0:root:/root:/bin/bash
    10:operator:x:11:0:operator:/root:/sbin/nologin
    
    [root@localhost grep]# grep -nv 'nologin' passwd 
    1:root:x:0:0:root:/root:/bin/bash
    6:sync:x:5:0:sync:/sbin:/bin/sync
    7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    8:halt:x:7:0:halt:/sbin:/sbin/halt
    
    [root@localhost grep]# grep -nA2 'root' passwd 
    1:root:x:0:0:root:/root:/bin/bash
    2-bin:x:1:1:bin:/bin:/sbin/nologin
    3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
    --
    10:operator:x:11:0:operator:/root:/sbin/nologin
    11-games:x:12:100:games:/usr/games:/sbin/nologin
    12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    
    [root@localhost grep]# grep -nB2 'root' passwd 
    1:root:x:0:0:root:/root:/bin/bash
    --
    8-halt:x:7:0:halt:/sbin:/sbin/halt
    9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10:operator:x:11:0:operator:/root:/sbin/nologin
    
    [root@localhost grep]# grep -nC2 'root' passwd 
    1:root:x:0:0:root:/root:/bin/bash
    2-bin:x:1:1:bin:/bin:/sbin/nologin
    3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
    --
    8-halt:x:7:0:halt:/sbin:/sbin/halt
    9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10:operator:x:11:0:operator:/root:/sbin/nologin
    11-games:x:12:100:games:/usr/games:/sbin/nologin
    12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    
    grep/egrep 예제
     grep -n 'root' /etc/passwd   
     grep -nv 'nologin' /etc/passwd
     grep '[0-9]'/etc/inittab        过滤包含数字0到9的行
     grep -v '[0-9]'/etc/inittab     过滤不包含数字0到9的行
     grep -v '^#' /etc/inittab       过滤给不以#号开头的行
     grep -v '^#' /etc/inittab|grep -v '^$'    过滤出不以#号开头以及空行的行 
     grep -n '^[^0-9]' passwd            过滤出以非数字开头的行
     grep '^[^a-zA-Z]' test.txt    过滤出非a-z A-Z 开头的行
     grep 'r.o' test.txt       .点表示任意一个字符,
     grep 'o*' test.txt       *表示*号左边的那个字符可重复0-n次,有o和没有o的行都会过滤出来
     grep '.*' test.txt           .* 点星表示任意个任意字符
     grep 'o\{2\}' /etc/passwd     在正则中花括号表示前面字符的重复范围,o\{2\}表示o出现两次,这里使用\是因为使用grep时花括号需要脱意
     egrep 'o{2}' /etc/passwd     使用egrep时,可以不使用脱意符号 ,过滤出o连续出现两次的行,像这样aobo不连续的不会过滤
     egrep 'o+' /etc/passwd      +号表示+号左边字符可得复1-n次
     egrep 'oo?' /etc/passwd     ?号表示前面那个字符重复0-1次, 包含0个o的或者1个o的都会过滤出来
     egrep 'root|nologin' /etc/passwd   | 表示或者的意思,过滤出包含root或者nologin的行
     egrep '(oo){2}' /etc/passwd        过滤出oo连续出现两次的行
    

    sed
    sed也能实现grep的功能,但是比较麻烦,sed的强项是替换指定字符
    sed -n '5'p test.txt 
     sed -n '1,5'p test.txt
     sed -n '1,$'p test.txt
     sed -n '/root/'p test.txt   -n表示只匹配有root的行,不加-n会把所有的行打印出来,p表示打印的意思 
     sed -n '/o\+t/'p passwd     
     sed -nr '/o+t/'p passwd     和sed -n '/o\+t/'p passwd一样,加-r就可以不用脱意符号
     sed -n '/^1/'p test.txt
     sed -n 'in$'p test.txt
     sed -n '/r..o/'p test.txt
     sed -n 'oo*'p test.txt
     sed -e '1'p -e '/111/'p -n test.txt
    
     sed '1'd test.txt
     sed '1,3'd test.txt
     sed '/oot/'d test.txt
     sed '1,2s/ot/to/g' test.txt
     sed 's#ot#to#g' test.txt
     sed 's/[0-9]//g' test.txt
     sed 's/[a-zA-Z]//g' test.txt
     sed -r 's/(rot)(.*)(bash)/\3\2\1/' test.txt
     sed 's/^.*$/123&/' test.txt
     sed -i 's/ot/to/g' test.txt
    

    둘째, DAY 5
    awk
    head -n2 test.txt|awk -F ':' '{print $1}'
     head -n2 test.txt|awk -F ':' '{print $0}'
     awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
     awk '/oo/' test.txt
     awk -F ':' '$1 ~/oo/' test.txt
     awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
     awk -F ':' '$3=="0"' /etc/passwd
     awk -F ':' '$3>="500"' /etc/passwd
     awk -F ':' '$3>=500' /etc/passwd 
     awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
    
    awk -F ':' '$3"5" && $31000 || $7=="/bin/bash"' /etc/passwd
     head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}‘
     awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd
     head -n3 /etc/passwd | awk -F ':' '{print NF}‘
     head -n3 /etc/passwd | awk -F ':' '{print NR}‘
     awk 'NR>40' /etc/passwd
     awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd
     head -n 3 /etc/passwd |awk -F ':' '$1="root"‘
     awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
     awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd

    좋은 웹페이지 즐겨찾기