셸 프로 그래 밍 의 정규 표현 식 (2)

15720 단어 shellsedLinux
텍스트 프로세서Linux/UNIX 시스템 에는 우리 가 이전에 배 운 VIM 편집기 와 grep 등 여러 가지 텍스트 프로세서 나 텍스트 편집기 가 포함 되 어 있 습 니 다.grep、sed、awkshell 프로 그래 밍 에서 자주 사용 되 는 텍스트 처리 도구 로 Shell 프로 그래 밍 삼 총사 라 고 불 린 다.
sed 도구sed(Stream EDitor) 텍스트 를 읽 을 수 있 는 강력 하고 간단 한 텍스트 해석 변환 도구 로 지정 한 조건 에 따라 텍스트 내용 을 편집 (삭제, 교체, 추가, 이동 등) 하고 마지막 으로 모든 줄 을 출력 하거나 출력 만 처리 하 는 일부 줄 을 출력 합 니 다.sed 상호작용 이 없 는 상황 에서 복잡 한 텍스트 처리 작업 을 실현 할 수 있 고 Shell 스 크 립 트 에 광범 위 하 게 응용 되 어 각종 자동화 처리 임 무 를 완성 할 수 있다.
  • sed 의 작업 절 차 는 주로 읽 기, 실행 과 표시 세 가지 과정 을 포함한다.
  • 읽 기: sed 입력 흐름 (파일, 파이프, 표준 입력) 에서 한 줄 의 내용 을 읽 고 임시 버퍼 에 저장 (모드 공간 이 라 고도 함)
  • 실행: 기본 적 인 상황 에서 모든 pattern space 명령 은 모드 공간 에서 순서대로 실 행 됩 니 다. 줄 의 주 소 를 지정 하지 않 으 면 sed 명령 은 모든 줄 에서 순서대로 실 행 됩 니 다
  • 수 정 된 내용 을 출력 흐름 으로 보 냅 니 다.데 이 터 를 다시 보 내 면 모드 공간 이 비 워 집 니 다
  • 모든 문서 내용 이 처리 되 기 전에 상기 과정 은 모든 내용 이 처 리 될 때 까지 반복 적 으로 실 행 될 것 이다
  • .
  • 기본 적 인 상황 에서 모든 sed 명령 은 모드 공간 에서 실 행 됩 니 다. 따라서 입력 한 파일 은 변경 되 지 않 습 니 다. 리 셋 으로 출력
  • 을 저장 하지 않 는 한.
    sed 명령
  • sed 명령 은 두 가지 형식 이 있 습 니 다.
    sed [选项] '操作' 参数        //“参数”是指操作的目标文件,当存在多个操作对象时用,文件之间用逗号“,”分隔
    或
    sed [选项] -f scriptfile 参数   // scriptfile 表示脚本文件,需要用“-f”选项指定
  • 흔 한 sed 명령 옵션
  • sed 또는 -e: 입력 한 텍스트 파일 을 지정 한 명령 이나 스 크 립 트 로 처리 하 는 것 을 의미 합 니 다
  • --expression= 또는 -f: 입력 한 텍스트 파일 을 지정 한 스 크 립 트 파일 로 처리 하 는 것 을 의미 합 니 다
  • --file= 또는 -h: 도움말 표시
  • --help, -n 또는 --quiet: 처리 후의 결과 만 나타 낸다
  • silent: 텍스트 파일 직접 편집
  • '조작' 은 파일 작업 에 대한 동작 행동, 즉 sed 명령 을 지정 하 는 데 사 용 됩 니 다.일반적으로 'n1 [, n2]' 조작 매개 변수 형식 을 사용 합 니 다.n1, n2 는 선택 할 수 있 는 것 으로 반드시 존재 하 는 것 이 아니 라 조작 을 하 는 줄 수 를 대표 한다. 만약 에 조작 을 5 ~ 20 줄 사이 에 해 야 한다 면 '5, 20 동작 행위' 를 나타 낸다.흔히 볼 수 있 는 조작 은 다음 과 같은 몇 가 지 를 포함한다.
  • -i: 증가, 현재 줄 아래 에 지정 한 줄 추가
  • a: 교체, 선택 한 줄 을 지정 한 내용 으로 교체
  • c: 선택 한 줄 삭제, 삭제
  • d: 삽입 하고 선택 한 줄 에 지정 한 내용 을 삽입 합 니 다
  • i: 인쇄, 줄 을 동시에 지정 하면 인쇄 지정 줄 을 표시 합 니 다.줄 을 지정 하지 않 으 면 모든 내용 을 인쇄 하 는 것 을 표시 합 니 다.인쇄 되 지 않 은 문자 가 있 으 면 p 코드 로 출력 합 니 다.보통 ASCII 옵션 과 함께 사용 합 니 다
  • “-n”: 교체, 지정 문자 교체
  • s: 문자 변환

  • 예시
    1) 조건 에 맞 는 텍스트 출력 (p 는 정상 출력 표시)
    [root@localhost opt]# sed -n 'p' httpd.txt     //输出文件所有内容,等同 cat httpd.txt
    #
    # This is the main Apache HTTP server configuration file.  It contains the
    # configuration directives that give the server its instructions.
    # See  for detailed information.
    # In particular, see 
    # 
    # for a discussion of each configuration directive.
    #
    # Do NOT simply read the instructions in here without understanding
    # what they do.  They're here only as hints or reminders.  If you are unsure
    # consult the online docs. You have been warned.  
    #
    # Configuration and logfile names: If the filenames you specify for many
    # of the server's control files begin with "/" (or "drive:/" for Win32), the
    # server will use that explicit path.  If the filenames do *not* begin
    # with "/", the value of ServerRoot is prepended -- so 'log/access_log'
    # with ServerRoot set to '/www' will be interpreted by the
    # server as '/www/log/access_log', where as '/log/access_log' will be
    ...//省略部分内容....
    [root@localhost opt]# sed -n '3p' httpd.txt     //输出第3行内容
    # configuration directives that give the server its instructions.
    [root@localhost opt]# sed -n '3,5p' httpd.txt    //输出3~5行内容
    # configuration directives that give the server its instructions.
    # See  for detailed information.
    # In particular, see 
    [root@localhost opt]# sed -n 'p;n' httpd.txt      //输出所有奇数行内容,n表示读入下一行资料
    #
    # configuration directives that give the server its instructions.
    # In particular, see 
    # for a discussion of each configuration directive.
    # Do NOT simply read the instructions in here without understanding
    # consult the online docs. You have been warned.  
    # Configuration and logfile names: If the filenames you specify for many
    # server will use that explicit path.  If the filenames do *not* begin
    # with ServerRoot set to '/www' will be interpreted by the
    # interpreted as '/log/access_log'.
    ...//省略部分内容....
    [root@localhost opt]# sed -n 'n;p' httpd.txt       //输出所有偶数行
    # This is the main Apache HTTP server configuration file.  It contains the
    # See  for detailed information.
    # 
    #
    # what they do.  They're here only as hints or reminders.  If you are unsure
    #
    # of the server's control files begin with "/" (or "drive:/" for Win32), the
    ...//省略部分内容....
    [root@localhost opt]# sed -n '1,5{p;n}' httpd.txt    //输出1~5行之间的奇数行(1、3、5行) 
    #
    # configuration directives that give the server its instructions.
    # In particular, see 
    [root@localhost opt]# sed -n '350,${n;p}' httpd.txt   //输出第350行至文件尾之间的偶数行
    #
    IncludeOptional conf.d/*.conf
    short
    wod
    woooood
    AxyzxyzC
    //在执行此命令时,读取的第1行时第350行,读取的第二行是第351行,依次类推,所以输出的偶数行是文件的第351行、第353行直至文件结尾,其中包括空行
  • y 명령 이 정규 표현 식 과 결합 할 때 형식 이 약간 다 릅 니 다. 정규 표현 식 은 sed 으로 포위 합 니 다
  • [root@localhost opt]# sed -n '/the/p' httpd.txt        //输出包含the的行
    # This is the main Apache HTTP server configuration file.  It contains the
    # configuration directives that give the server its instructions.
    # Do NOT simply read the instructions in here without understanding
    # what they do.  They're here only as hints or reminders.  If you are unsure
    # consult the online docs. You have been warned.  
    # Configuration and logfile names: If the filenames you specify for many
    # of the server's control files begin with "/" (or "drive:/" for Win32), the
    # server will use that explicit path.  If the filenames do *not* begin
    # with "/", the value of ServerRoot is prepended -- so 'log/access_log'
    # with ServerRoot set to '/www' will be interpreted by the
    [root@localhost opt]# sed -n '4,/the/p' httpd.txt     //输出从第4行至第一个包含the的行
    # See  for detailed information.
    # In particular, see 
    # 
    # for a discussion of each configuration directive.
    #
    # Do NOT simply read the instructions in here without understanding
    [root@localhost opt]# sed -n '/the/=' httpd.txt     //输出包含the的所在行的行号,等号(=)用来输出行号
    2
    3
    9
    10
    11
    13
    14
    ...//省略部分内容...
    [root@localhost opt]# sed -n '/^sh/p' httpd.txt    //输出以sh开头的行
    shirt
    short
    [root@localhost opt]# sed -n '/[0-9]$/p' httpd.txt     //输出以数字结尾的行
    #Listen 12.34.56.78:80
    Listen 80
    #ServerName www.example.com:80
    AddDefaultCharset UTF-8
    [root@localhost opt]# sed -n '/\/p' httpd.txt      //输出包含的单词wood的行,\代表单词边界
    wood

    2) 조건 에 맞 는 텍스트 삭제 (d)
  • 아래 명령 에서 “/” 명령 은 파일 의 줄 수 를 계산 하 는 데 사용 되 며, 이 명령 과 결합 하면 명령 이 실 행 된 결 과 를 더욱 직관 적 으로 볼 수 있다.
  • [root@localhost opt]# nl httpd.txt | sed '3d'      //删除第3行
         1  u
         2  # This is the main Apache HTTP server configuration file.  It contains the
         4  # See  for detailed information.
         5  # In particular, see 
         6  # 
         7  # for a discussion of each configuration directive.
    ...//省略部分内容...
    [root@localhost opt]# nl httpd.txt | sed '3,5d'     //删除3~5行
         1  u
         2  # This is the main Apache HTTP server configuration file.  It contains the
         6  # 
         7  # for a discussion of each configuration directive.
         ...//省略部分内容...
    [root@localhost opt]# nl httpd.txt | sed '/wood/d'     //删除包含wood的行,原第321行被删除
         1  u                                     //删除不包含cross 的行,用!符号表示取反操作,如'/cross/!d'
         2  # This is the main Apache HTTP server configuration file.  It contains the
         3  # configuration directives that give the server its instructions.
         ...//省略部分内容...
       318  short
       319  wd
       320  wod
       322  woooood
       323  AxyzC
       324  AxyzxyzC 
    [root@localhost opt]# sed '/^[a-z]/d' httpd.txt     //删除以小写字母开头的行
    # This is the main Apache HTTP server configuration file.  It contains the
    # configuration directives that give the server its instructions.
    ...//省略部分内容...
    # Load config files in the "/etc/httpd/conf.d" directory, if any.
    IncludeOptional conf.d/*.conf
    AxyzC
    AxyzxyzC
    [root@localhost opt]# sed '/\.$/d' httpd.txt    //删除以“.”结尾的行
    u
    # This is the main Apache HTTP server configuration file.  It contains the
    # In particular, see 
    # 
    ...//省略部分内容...
    [root@localhost opt]# sed '/^$/d' httpd.txt      //删除所有空行
    u
    # This is the main Apache HTTP server configuration file.  It contains the
    # configuration directives that give the server its instructions.
    # See  for detailed information.
    # In particular, see 
    # 
    # for a discussion of each configuration directive.
    //注意: 若是删除重复的空行,即连续的空行只保留一个, 执行“ sed –e ‘/^$/{n;/^$/d}’ httpd.txt”命令即可实现。其效果与“cat -s test.txt”相同,n 表示读下一行数据。

    3) 조건 에 맞 는 텍스트 교체
  • 명령 을 사용 하여 교체 작업 을 할 때 nl (문자열 교체), sed (전체 줄/전체 블록 교체), s (문자 변환) 명령 옵션
  • 을 사용 해 야 합 니 다.
    [root@localhost opt]# sed 's/the/THE/' httpd.txt     //将每行中第一个the替换为THE
    u
    # This is THE main Apache HTTP server configuration file.  It contains the
    # configuration directives that give THE server its instructions.
    # See  for detailed information.
    # In particular, see 
    ...//省略部分内容...
    [root@localhost opt]# vim aaa.txt       //编辑一个新文件
    llllll
    llllll
    llllll                                  //编辑内容
    llllll
    llllll
    llllll
    ~                                                                             
    ~                                                                             
    :wq                                     //保存退出
    [root@localhost opt]# sed 's/l/L/3' aaa.txt     //将每行中第3个l替换为L
    llLlll
    llLlll                                           //显示替换后内容
    llLlll
    llLlll
    llLlll
    llLlll
    [root@localhost opt]# sed 's/the/THE/g' httpd.txt    //将文件中多有的the替换为THE
    u
    # This is THE main Apache HTTP server configuration file.  It contains THE
    # configuration directives that give THE server its instructions.
    # See  for detailed information.
    # In particular, see 
    ...//省略部分内容...
    [root@localhost opt]# sed 's/o//g' httpd.txt      //将文件中所有的o删除(替换为空串)
    u
    # This is the main Apache HTTP server cnfiguratin file.  It cntains the
    # cnfiguratin directives that give the server its instructins.
    ...//省略部分内容...
    shirt
    shrt
    wd
    wd
    wd
    wd
    AxyzC
    AxyzxyzC
    [root@localhost opt]# sed 's/^/#/' aaa.txt     //在每行行首插入#号
    #llllll
    #llllll
    #llllll
    #llllll
    #llllll
    #llllll
    [root@localhost opt]# sed 's/$/eof/' aaa.txt     //在每行行尾插入字符串eof
    lllllleof
    lllllleof
    lllllleof
    lllllleof
    lllllleof
    lllllleof
    [root@localhost opt]# vim aaa.txt        //编辑文件
    llllll
    llllll
    llllll
    llllll
    llllll
    llllll
    aaaaaa
    aaaaaa                        //添加内容
    aaaaaa
    aaaaaa
    aaaaaa
    ~                                                                             
    ~                                                                             
    :wq                            //保存退出
    [root@localhost opt]# sed '/a/s/^/#/' aaa.txt         //在包含 a 的每行行首插入#号
    llllll
    llllll
    llllll
    llllll
    llllll
    llllll
    #aaaaaa
    #aaaaaa
    #aaaaaa
    #aaaaaa
    #aaaaaa
    [root@localhost opt]# sed '3,5s/l/L/g' aaa.txt    //将第 3~5 行中的所有 l 替换为 L
    llllll
    llllll
    LLLLLL
    LLLLLL
    LLLLLL
    llllll
    aaaaaa
    aaaaaa
    aaaaaa
    aaaaaa
    aaaaaa
    [root@localhost opt]# vim bbb.txt    //编辑一个新文件
    this is
    the wood
    wood
    wod                             //编辑内容
    the wood
    this is test
    ~                                                                             
    ~                                                                             
    :wq                               //保存退出
    [root@localhost opt]# sed '/the/s/o/O/g' bbb.txt    //将包含 the 的所有行中的 o 都替换为 O
    this is
    the wOOd
    wood
    wod
    the wOOd
    this is test

    4) 조건 에 맞 는 텍스트 이전
  • c 클립보드 로 복사 하기;y, H 클립보드 의 데 이 터 를 지정 한 줄 에 덮어 쓰 거나 추가 합 니 다.g 파일 로 저장 하기;G 지정 한 파일 읽 기;w, 추가 지정 내용.
  • [root@localhost opt]# sed '/the/{H;d};$G' bbb.txt    //将包含the 的行迁移至文件末尾,{;}用于多个操作
    this is
    wood
    wod
    this is test
    
    the wood
    the wood
    [root@localhost opt]# sed '1,3{H;d};8G' aaa.txt     //将1~3行内容迁移到8行之后
    llllll
    llllll
    llllll
    aaaaaa
    aaaaaa
    
    llllll
    llllll
    llllll
    aaaaaa
    aaaaaa
    aaaaaa
    [root@localhost opt]# sed '/the/w ccc.txt' bbb.txt     //将包含the 的行另存为文件ccc.txt
    this is
    the wood
    wood
    wod
    the wood
    this is test
    [root@localhost opt]# cat ccc.txt                  //查看保存的文件内容
    the wood
    the wood
    [root@localhost opt]# sed '/the/r /etc/hostname' bbb.txt   
    this is                                  //将文件/etc/hostname 的内容添加到包含the 的每行以后
    the wood
    localhost.localdomain
    wood
    wod
    the wood
    localhost.localdomain
    this is test
    [root@localhost opt]# sed '3aNEW' bbb.txt   //在第 3 行后插入一个新行,内容为 NEW
    this is
    the wood
    wood
    NEW
    wod
    the wood
    this is test
    [root@localhost opt]# sed '/the/aNEW' bbb.txt     //在包含the 的每行后插入一个新行,内容为 NEW
    this is
    the wood
    NEW
    wood
    wod
    the wood
    NEW
    this is test
    [root@localhost opt]# sed '3aNEW
    NEW2' bbb.txt //在第 3 行后插入多行内容,中间的
    表示换行 this is the wood wood NEW NEW2 wod the wood this is test

    5) 스 크 립 트 로 파일 편집
  • 스 크 립 트 를 사용 하여 여러 개의 편집 명령 을 파일 에 저장 하고 (줄 마다 편집 명령) 옵션 을 통 해 호출 합 니 다.
  • sed '1,3{H;d};6G' bbb.txt    //将1~3行的内容迁移到6行之后
    
    [root@localhost opt]# vim test
    1,3H
    1,3d
    6G
    ~                                                                            
    :wq 
    [root@localhost opt]# sed -f test bbb.txt 
    wod
    the wood
    this is test
    
    this is
    the wood
    wood

    6) sed 직접 작업 파일 예제
  • 서비스 설정 을 조정 하기 위해 스 크 립 트 를 만 듭 니 다. 익명 사용 자 는 금지 되 지만 로 컬 사용 자 는 기록 할 수 있 습 니 다.
  • [root@localhost ~]# **vim local_only_ftp.sh** 
    #!/bin/bash
    #指定样本文件路径、配置文件路径
    SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf " CONFIG="/etc/vsftpd/vsftpd.conf"
    #备份原来的配置文件,检测文件名为/etc/vsftpd/vsftpd.conf.bak 备份文件是否存在, 若不存在则使用 cp 命令进行文件备份
    [ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak      //基于样本配置进行调整,覆盖现有文件
    sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
    sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG
    # 启动vsftpd 服务,并设为开机后自动运行systemctl restart vsftpd
    systemctl enable vsftpd
    [root@localhost ~]# **chmod +x local_only_ftp.sh

    좋은 웹페이지 즐겨찾기