(5) 정규 표현 식 과 파일 작업 - 특수 문자 와 POSIX 문자, sed 와 awk 명령 작업 등

31315 단어 Shell
글 목록
  • 1. 특수 문자
  • 1.1, 위치 매 칭
  • 1.2, 문자열 일치
  • 1.3 수량 한정 매 칭
  • 2. POSIX 문자
  • 3. 셸 명령 이 파일 에 대한 조작
  • 3.1, sed 명령 - 줄 편집기
  • 3.1.1, sed 처리 데이터 원리
  • 3.1.2, sed 명령 문법
  • 3.1.3, sed 명령 예시 설명
  • 3.1.3, sed 명령 기법
  • 3.2, awk 명령 용법 - 줄 편집기
  • 3.2.1, awk 기초 용법


  • 특수 문자
    1.1 위치 일치
    위치 문자
    속뜻
    ^
    줄 끝 과 일치 합 니 다. ^ a 는 a 로 시작 합 니 다. 기본 닻 은 문자 로 정 합 니 다.
    $
    줄 의 첫 번 째 와 일치 합 니 다. a $는 a 로 끝 납 니 다. 기본 닻 은 문자 로 정 합 니 다.
  • 사용 기법: 시작 과 끝 을 동시에 고정 시 키 고 정확하게 일치 할 수 있다.단일 닻 은 시작 이나 끝 을 정 하고 모호 한 매 칭 을 한다.
  • egrep 명령 은 grep - E 와 같 습 니 다. 정규 표현 식 을 지원 합 니 다. 파일 내용 과 일치 합 니 다
  • aaasdc
    a_c
    abbbc
    abbc
    bcc
    dddc
    dc
    aa
    bbcc
    aZc
    abc
    ac
    da
    ddb
    asdfda
    
    # 精确匹配
    [marc@localhost Shell]$ egrep "^ac$" regular_expression_file
    ac
    
    # 模糊匹配
    [marc@localhost Shell]$ egrep "^a" regular_expression_file 
    aaasdc
    a_c
    abbbc
    abbc
    aa
    aZc
    abc
    ac
    asdfda
    [marc@localhost Shell]$ egrep "c$" regular_expression_file
    aaasdc
    a_c
    abbbc
    abbc
    bcc
    dddc
    dc
    bbcc
    aZc
    abc
    ac
    

    1.2 문자열 일치
    특수 문자
    속뜻
    .
    리 턴 을 제외 한 임의의 문자 와 일치 합 니 다.
    ( )
    문자열 그룹
    [ ]
    괄호 안에 있 는 임의의 문자 와 일치 하 는 문자 클래스 를 정의 합 니 다.
    [ ^ ]
    괄호 안에 문자 이외 의 문자 가 나타 나 는 것 을 반대로 표시 합 니 다.
    \
    전의 문자
    |
    파이프
    [marc@localhost Shell]$ egrep "^a.c$" regular_expression_file
    a_c
    aZc
    abc
    [marc@localhost Shell]$ egrep "^(a|d)c$" regular_expression_file
    dc
    ac
    

    1.3 수량 한정 매 칭
    수량 문자
    속뜻
    *
    이전 문자 0 ~ 임 의 일치
    +
    이전 문자 1 ~ 임 의 일치
    ?
    이전 문자 0 ~ 1 번 일치
    {n,m}
    이전 문자 n ~ m 회 일치
    {n}
    이전 문자 n 회 일치
    [marc@localhost Shell]$ egrep "^ab*c$" regular_expression_file
    abbbc
    abbc
    abc
    ac
    [marc@localhost Shell]$ egrep "^ab?c$" regular_expression_file
    abc
    ac
    [marc@localhost Shell]$ egrep "^ab+c$" regular_expression_file
    abbbc
    abbc
    abc
    

    POSIX 문자
    POSIX 문자
    속뜻
    [:alnum:]
    임의의 숫자 알파벳 문자 0 - 9 a - z A - Z 일치
    [:alpha:]
    임의의 자모, 대문자 또는 소문 자 a - z A - Z 일치
    [:digit:]
    임의의 숫자 0 - 9 일치
    [:graph:]
    공백 문자 가 아 닌 공백 제어 문자 와 일치 합 니 다.
    [:lower:]
    소문 자 a - z 일치
    [:upper:]
    대문자 A - Z 일치
    [:ctrl:]
    일치 제어 문자
    [:print:]
    빈 칸 을 포함 하여 비어 있 지 않 은 문자 와 일치 합 니 다.
    [:punct:]
    일치 문장 부호
    [:blank:]
    공백 과 TAB 문자 일치
    [:xdigit:]
    16 진수 일치
    [:space:]
    모든 공백 문자, 새 줄, 빈 칸, 탭 문자 와 일치 합 니 다.
  • 주의: 이중 괄호 [[[]]: 첫 번 째 중 괄호 는 일치 하 는 문자 로 임의의 문자 와 일치 하 는 것 을 표시 합 니 다.두 번 째 괄호 는 형식 [: digit:] 자체 소유 입 니 다.
  • [marc@localhost Shell]$ egrep "^a[[:alnum:]]c$" regular_expression_file
    aZc
    abc
    [marc@localhost Shell]$ egrep "^a[[:upper:]]c$" regular_expression_file
    aZc
    [marc@localhost Shell]$ egrep "^a[[:lower:]]c$" regular_expression_file
    abc
    [marc@localhost Shell]$ egrep "^a[[:alnum:]]*c$" regular_expression_file
    aaasdc
    abbbc
    abbc
    aZc
    abc
    ac
    

    3. 셸 명령 의 파일 조작
    3.1, sed 명령 - 줄 편집기
        sed 명령 은 Linux 가 제공 하 는 외부 명령 으로 텍스트 를 직접 조작 하고 비 상호작용 적 으로 파일 을 증가, 삭제, 수정, 검사 등 작업 을 한다.사용 시 명령 행 에 편집 명령 을 입력 하고 파일 이름 을 지정 한 다음 화면 에서 출력 을 봅 니 다.텍스트 편집기 와 본질 적 인 차이 가 있 습 니 다.
  • 줄 편집기: 편집 대상 은 파일 의 줄 입 니 다.
  • 텍스트 편집기: 편집 대상 은 파일 입 니 다.

  • 3.1.1 sed 처리 데이터 원리
    텍스트 의 한 줄
    캐 시
    데 이 터 는 캐 시 에서 처리 합 니 다.
    컴퓨터 화면
    * 8195, * 8195, * 8195, * 8195, * 8195, * 8195, * 8195, sed 는 텍스트 파일 에서 메모리 로 한 줄 을 읽 은 다음 메모리 에서 파일 을 수정 하고 수정 이 끝 난 후에 화면 에 인쇄 합 니 다.
    3.1.2 sed 명령 문법
    문법: sed [options] '{command} [flags]' [filename]
    命令选项:
      -e script     将脚本中指定的命令添加到处理输入时执行的命令中,多条件, 一行中要有多个条件     如: sed -e 's/brown/green/;s/dog/cat/' sed_file     # 多条命令
      -f filename   将处理文件时输入的执行命令添加到指定的文件中     如: sed -f command_file sed_file  (command_file文件中包含了要执行的命令)
      -n          抑制自动输出                        如: sed -n '2,3s/dog/cat/p' sed_file                 # 只打印出有用内容
      -i          编辑文件内容                        如: sed -i 's/dog/cat/g' sed_file          # 源文件被修改(不可逆)
      -i.bak      修改时同时创建.bak备份文件          如: sed -i.bak 's/cat/dog/g' sed_file      # 修改源文件的同时创建备份文件           
      -r          使用扩展的正则表达式                如: sed -n -r '/^(root)(.*)(bash)$/p' /etc/passwd
      !          取反(跟在模式条件后与shell有所区别)
    
    sed常用内部命令:
      a           在匹配后面添加                     如: sed '/3 the/a\hello world' sed_file    # /3 the/ 表示匹配含有3 the的行,a表示行后面添加,hello world为要添加的内容
      i           在匹配前面添加                     如: sed '/3 the/i\hello world' sed_file  
      p           打印                               如: sed '/3 the/p' sed_file           # 第3行打印2遍,其余行打印一遍    
      d           删除                               如: sed '/3 the/d' sed_file    
      s           直接替换                           如: sed '2,4s/dog/cat/' sed_file          # 将2-4行中的出现的第一个dog替换为cat ,可以添加g进行全局替换(行) 
      c           更改                               如: sed '2,4c\hello world' sed_file        # 直接将2-4行的所有内容替换为一行指定添加的内容
      y           转换  N  D  P                      如: sed  'y/acbdef/ABCXYZ/' sed_file
    
    flags:对命令进行补充
      数字         表示新文本替换的模式                如: sed 's/dog/cat/2' sed_file         # 将每一行第2次出现的dog替换为cat
      g           表示新文本替换现有文本的全部实例     如: sed '2,4s/dog/cat/g' sed_file       # 全局替换, 将第2-4行出现的所有的dog全部替换为cat
      p           表示打印原始的内容                  如: sed '3s/dog/cat/p' sed_file         # 替换的同时进行打印, 可以同时使用s///gp
      w filename  将替换的结果写入文件                如: sed '2,4s/dog/cat/w m_file' sed_file       # 将替换后的结果写入m_file文件中,系统会自动创建文件
    

    3.1.3 sed 명령 예시 설명
    프레젠테이션 파일 1:
    1 the quick brown fox jumps over the lazy dog
    2 the quick brown fox jumps over the lazy dog
    3 the quick brown fox jumps over the lazy dog
    4 the quick brown fox jumps over the lazy dog
    5 the quick brown fox jumps over the lazy dog
    
    ########################### sed内部常用命令 ###################################
    
    1)  a  在匹配后面添加 —— 可以使用转义字符\将a与添加内容分隔开
    [marc@localhost Shell]$ sed 'a\hello world' sed_file                 # 在每一行后面添加上hello world 
    1 the quick brown fox jumps over the lazy dog
    hello world
    2 the quick brown fox jumps over the lazy dog
    hello world
    3 the quick brown fox jumps over the lazy dog
    hello world
    4 the quick brown fox jumps over the lazy dog
    hello world
    5 the quick brown fox jumps over the lazy dog
    hello world
    [marc@localhost Shell]$ sed '3a\hello world' sed_file                # 在第3行后面添加上hello world 
    1 the quick brown fox jumps over the lazy dog
    2 the quick brown fox jumps over the lazy dog
    3 the quick brown fox jumps over the lazy dog
    hello world
    4 the quick brown fox jumps over the lazy dog
    5 the quick brown fox jumps over the lazy dog
    [marc@localhost Shell]$ sed '2,4a\hello world' sed_file              # 在第2-4行后面添加上hello world 
    1 the quick brown fox jumps over the lazy dog
    2 the quick brown fox jumps over the lazy dog
    hello world
    3 the quick brown fox jumps over the lazy dog
    hello world
    4 the quick brown fox jumps over the lazy dog
    hello world
    5 the quick brown fox jumps over the lazy dog
    [marc@localhost Shell]$ sed '/3 the/a\hello world' sed_file           # 通过/ / 匹配,在第3行后面添加上hello world 
    1 the quick brown fox jumps over the lazy dog
    2 the quick brown fox jumps over the lazy dog
    3 the quick brown fox jumps over the lazy dog
    hello world
    4 the quick brown fox jumps over the lazy dog
    5 the quick brown fox jumps over the lazy dog
    
    2)  i  在匹配前面添加 —— sed命令只改变输出在屏幕上的内容,原文本自身的并不发生改变
    [marc@localhost Shell]$ sed 'i\hello world' sed_file
    [marc@localhost Shell]$ sed '2i\hello world' sed_file
    [marc@localhost Shell]$ sed '2,4i\hello world' sed_file
    [marc@localhost Shell]$ sed '/3 the/i\hello world' sed_file
    
    3)  p  打印 —— 输出两遍内容, 打印一遍文件内容,同时又从缓存输出一遍
    [marc@localhost Shell]$ sed 'p' sed_file        
    1 the quick brown fox jumps over the lazy dog
    1 the quick brown fox jumps over the lazy dog
    2 the quick brown fox jumps over the lazy dog
    2 the quick brown fox jumps over the lazy dog
    3 the quick brown fox jumps over the lazy dog
    3 the quick brown fox jumps over the lazy dog
    4 the quick brown fox jumps over the lazy dog
    4 the quick brown fox jumps over the lazy dog
    5 the quick brown fox jumps over the lazy dog
    5 the quick brown fox jumps over the lazy dog
    
    [marc@localhost Shell]$ sed '3p' sed_file                      
    [marc@localhost Shell]$ sed '2,4p' sed_file                           # 第2-4行打印2遍,其余行打印一遍
    [marc@localhost Shell]$ sed '/3 the/p' sed_file                       # 第3行打印2遍,其余行打印一遍  
    
    4)  d  删除 —— 常使用匹配删除
    [marc@localhost Shell]$ sed 'd' sed_file  
    [marc@localhost Shell]$ sed '3d' sed_file
    [marc@localhost Shell]$ sed '2,4d' sed_file
    [marc@localhost Shell]$ sed '/3 the/d' sed_file                         # 删除第3行
    
    5)  s  直接替换 —— 使用方法 s/ / /
    [marc@localhost Shell]$ sed 's/dog/cat/' sed_file                      # 替换所有行中的dog      
    [marc@localhost Shell]$ sed '3s/dog/cat/' sed_file                     # 替换第3行中的dog      
    [marc@localhost Shell]$ sed '2,4s/dog/cat/' sed_file 
    [marc@localhost Shell]$ sed '/3 the/s/dog/cat/' sed_file               # 先匹配第3行,在替换第3行中的dog      
    
    6)  c  更改 ——  指定多行更改时,会直接将其看做一行进行更改
    [marc@localhost Shell]$ sed 'c\hello world' sed_file
    hello world
    hello world
    hello world
    hello world
    hello world
    [marc@localhost Shell]$ sed '3c\hello world' sed_file
    1 the quick brown fox jumps over the lazy dog
    2 the quick brown fox jumps over the lazy dog
    hello world
    4 the quick brown fox jumps over the lazy dog
    5 the quick brown fox jumps over the lazy dog
    [marc@localhost Shell]$ sed '2,4c\hello world' sed_file                 # 直接将2-4行的所有内容替换为一行指定添加的内容
    1 the quick brown fox jumps over the lazy dog
    hello world
    5 the quick brown fox jumps over the lazy dog
    [marc@localhost Shell]$ sed '/3 the/c\hello world' sed_file             # 先匹配,再更改
    1 the quick brown fox jumps over the lazy dog
    2 the quick brown fox jumps over the lazy dog
    hello world
    4 the quick brown fox jumps over the lazy dog
    5 the quick brown fox jumps over the lazy dog
    
    7) y  转换 —— 一一对应,且不能使用类似范围操作符的符号
    [marc@localhost Shell]$ sed  'y/acbdef/ABCXYZ/' sed_file
    1 thY quiBk Crown Zox jumps ovYr thY lAzy Xog
    2 thY quiBk Crown Zox jumps ovYr thY lAzy Xog
    3 thY quiBk Crown Zox jumps ovYr thY lAzy Xog
    4 thY quiBk Crown Zox jumps ovYr thY lAzy Xog
    5 thY quiBk Crown Zox jumps ovYr thY lAzy Xog
    

    프레젠테이션 파일 2:
    1 the quick brown fox jumps over the lazy dog,dog
    2 the quick brown fox jumps over the lazy dog,dog
    3 the quick brown fox jumps over the lazy dog,dog
    4 the quick brown fox jumps over the lazy dog,dog
    5 the quick brown fox jumps over the lazy dog,dog
    
    ############################### flags标志位用法 ##############################
    1[marc@localhost Shell]$ sed 's/dog/cat/2' sed_file         # 数字
    1 the quick brown fox jumps over the lazy dog,cat
    2 the quick brown fox jumps over the lazy dog,cat
    3 the quick brown fox jumps over the lazy dog,cat
    4 the quick brown fox jumps over the lazy dog,cat
    5 the quick brown fox jumps over the lazy dog,cat
    
    2[marc@localhost Shell]$ sed '3s/dog/cat/p' sed_file        # p 打印
    1 the quick brown fox jumps over the lazy dog,dog
    2 the quick brown fox jumps over the lazy dog,dog
    3 the quick brown fox jumps over the lazy cat,dog
    3 the quick brown fox jumps over the lazy cat,dog
    4 the quick brown fox jumps over the lazy dog,dog
    5 the quick brown fox jumps over the lazy dog,dog
    
    [marc@localhost Shell]$ sed 's/dog/cat/g' sed_file           # g 全局替换
    1 the quick brown fox jumps over the lazy cat,cat
    2 the quick brown fox jumps over the lazy cat,cat
    3 the quick brown fox jumps over the lazy cat,cat
    4 the quick brown fox jumps over the lazy cat,cat
    5 the quick brown fox jumps over the lazy cat,cat
    
    [marc@localhost Shell]$ sed '2,4s/dog/cat/w m_file' sed_file   # w filename 写入文件
    1 the quick brown fox jumps over the lazy dog,dog
    2 the quick brown fox jumps over the lazy cat,dog
    3 the quick brown fox jumps over the lazy cat,dog
    4 the quick brown fox jumps over the lazy cat,dog
    5 the quick brown fox jumps over the lazy dog,dog
    [marc@localhost Shell]$ cat m_file
    2 the quick brown fox jumps over the lazy cat,dog
    3 the quick brown fox jumps over the lazy cat,dog
    4 the quick brown fox jumps over the lazy cat,dog
    
    ########################### 命令选项 #############################333
    1-n  抑制自动输出 —— 用于打印时避免不必要的输出
    [marc@localhost Shell]$ sed -n '2,3s/dog/cat/p' sed_file                 # 只打印出有用内容
    2 the quick brown fox jumps over the lazy cat,dog
    3 the quick brown fox jumps over the lazy cat,dog
    
    2-e script  将脚本中指定的命令添加到处理输入时执行的命令中,多条件, 一行中要有多个条件
    [marc@localhost Shell]$ sed -e 's/brown/green/;s/dog/cat/' sed_file     # 多条命令
    1 the quick green fox jumps over the lazy cat,dog
    2 the quick green fox jumps over the lazy cat,dog
    3 the quick green fox jumps over the lazy cat,dog
    4 the quick green fox jumps over the lazy cat,dog
    5 the quick green fox jumps over the lazy cat,dog
    
    3-f file_name   将处理文件时输入的执行命令添加到指定的文件中 
    [marc@localhost Shell]$ g command_file                        # 文件command_file中的内容即为:s/brown/green/;s/dog/cat/   可改写成两行
    [marc@localhost Shell]$ sed -f command_file sed_file
    1 the quick green fox jumps over the lazy cat,dog
    2 the quick green fox jumps over the lazy cat,dog
    3 the quick green fox jumps over the lazy cat,dog
    4 the quick green fox jumps over the lazy cat,dog
    5 the quick green fox jumps over the lazy cat,dog
    
    4-i   修改源文件
    [marc@localhost Shell]$ sed -i 's/dog/cat/g' sed_file          # 源文件被修改(不可逆)
    [marc@localhost Shell]$ cat sed_file
    1 the quick brown fox jumps over the lazy cat,cat
    2 the quick brown fox jumps over the lazy cat,cat
    3 the quick brown fox jumps over the lazy cat,cat
    4 the quick brown fox jumps over the lazy cat,cat
    5 the quick brown fox jumps over the lazy cat,cat
    
    5-i.bak     修改源文件同时创建.bak备份文件
    [marc@localhost Shell]$ sed -i.bak 's/cat/dog/g' sed_file      # 修改源文件的同时创建备份文件
    [marc@localhost Shell]$ ls
    sed_file   sed_file.bak        
    [marc@localhost Shell]$ cat sed_file.bak 
    1 the quick brown fox jumps over the lazy cat,cat
    2 the quick brown fox jumps over the lazy cat,cat
    3 the quick brown fox jumps over the lazy cat,cat
    4 the quick brown fox jumps over the lazy cat,cat
    5 the quick brown fox jumps over the lazy cat,cat
    [marc@localhost Shell]$ cat sed_file
    1 the quick brown fox jumps over the lazy dog,dog
    2 the quick brown fox jumps over the lazy dog,dog
    3 the quick brown fox jumps over the lazy dog,dog
    4 the quick brown fox jumps over the lazy dog,dog
    5 the quick brown fox jumps over the lazy dog,dog
    
    6-r   使用扩展的正则表达式 —— 元字符为标志
    [marc@localhost Shell]$ sed -n -r '/^(root)(.*)(bash)$/p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    

    3.1.3 sed 명령 기법
  • 파이프 문자 | 결합
  • [marc@localhost Shell]$ echo "marc is cool" | sed 's/cool/wonderful/'
    marc is wonderful
    
  • $= 통계 텍스트 가 몇 줄
  • [marc@localhost Shell]$ sed -n '$=' sed_file
    5
    

    3.2 awk 명령 용법 - 줄 편집기
    3.2.1 awk 기초 용법
    * 8195 ° awk 명령 은 Linux 가 제공 하 는 외부 명령 으로 sed 와 달리 awk 명령 은 데이터 의 처리, 연산, 출력 을 실현 할 수 있 고 기능 이 매우 강하 다.awk 는 파일 의 모든 줄 이 하나의 기록 이 고 기록 과 기록 사이 의 구분자 가 줄 바 꿈 문자 라 고 생각 합 니 다.각 열 은 필드 입 니 다. 필드 와 필드 사이 의 구분 자 는 기본적으로 하나 이상 의 빈 칸 이나 Tab 탭 문자 입 니 다.
    『 8195 』 실현 가능 한 기본 기능 은 다음 과 같다.
  • 줄 캡 처
  • 열 캡 처
  • 문자열 캡 처
  • 자세 한 내용 은 링크: 링크.

    좋은 웹페이지 즐겨찾기