• 计算机基础9


    正则表达式

    ^ 行首
    $ 行尾
    . 除了换行符以外的任意单个字符
    * 前导字符的零个或多个
    .* 所有字符
    
    [] 字符组内的任一字符
    [^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)
    ^[^] 非字符组内的字符开头的行
    [a-z] 小写字母
    [A-Z] 大写字母
    [a-Z] 小写和大写字母
    [0-9] 数字
    
    < 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
    > 单词尾
    扩展正则 加 -r 参数 或转义
    sed -n '/roo?/p' /etc/passwd
    sed -rn '/roo?/p' /etc/passwd
    ? 前导字符零个或一个
    + 前导字符一个或多个
    abc|def abc或def
    a(bc|de)f abcf 或 adef
    x{m} x出现m次
    x{m,} x出现m次至多次(至少m次)
    x{m,n} x出现m次至n次

    grep命令

    -n :显示行号
    -o :只显示匹配的内容
    -q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
    -l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc
    -A :如果匹配成功,则将匹配行及其后n行一起打印出来
    -B :如果匹配成功,则将匹配行及其前n行一起打印出来
    -C :如果匹配成功,则将匹配行及其前后n行一起打印出来
    --color
    -c :如果匹配成功,则将匹配到的行数打印出来
    -E :等于egrep,扩展
    -i :忽略大小写
    -v :取反,不匹配
    -w:匹配单词

    [root@scott dir]# grep -i 'hello' test.py
    print('韦哥hello!')
    [root@scott dir]# grep -i '正方形' test.py
    print('韦哥正方形打野!')
    [root@scott dir]# grep -iv '正方形' test.py
    #coding:utf-8
    print('韦哥蛇蛇蛇社会摇!')
    print('韦哥hello!')
    print('韦哥三角形中单!')
    print('韦哥蛇皮走位!')
    print('韦哥骚骚!')
    print('韦哥蛇蛇蛇社会摇!')
    [root@scott dir]# grep -c '正方形' test.py
    1
    [root@scott dir]# grep -c 'hello' test.py
    1
    [root@scott dir]# grep -c '韦哥' test.py
    7
    [root@scott dir]# grep -n '打野' test.py
    4:print('韦哥正方形打野!')
    
    [root@scott dir]# grep -C 2 '打野' test.py
    print('韦哥蛇蛇蛇社会摇!')
    print('韦哥hello!')
    print('韦哥正方形打野!')
    print('韦哥三角形中单!')
    print('韦哥蛇皮走位!')
    [root@scott dir]# grep -A 2 '打野' test.py
    print('韦哥正方形打野!')
    print('韦哥三角形中单!')
    print('韦哥蛇皮走位!')
    [root@scott dir]# grep -B 2 '打野' test.py
    print('韦哥蛇蛇蛇社会摇!')
    print('韦哥hello!')
    print('韦哥正方形打野!')
    
    

    sed命令

    • sed

    流编辑器 stream editer,是以行为单位的处理程序

    sed 流编辑器 stream editer

    语法

    sed [options] 'command' in_file[s]

    options 部分

    -n #部位每个命令生成输出,等待print命令输出
    -e script #将script中的命令添加到运行的命令中
    -i #确认修改sed操作并且保存
    -f file #将file中的命令添加到运行的命令中

    command 部分

    '[地址1,地址2] [函数] [参数(标记)]'

    定址的方法 1.数字 2.正则

    • 数字
      十进制数
      1 单行
      1,3 范围 从第一行到第三行
      2,+4 匹配行后若干行
      4,~3 从第四行到下一个3的倍数行
      2~3 第二行起每间隔三行的行
      $ 尾行
      1! 除了第一行以外的行

    • 正则
      正则必须用//包裹起来
      扩展正则需要用 -r 参数或转义
      数字定址:sed -n '1p' /etc/passwd
      正则定址:sed -n '/^root/p' /etc/passwd

    作业

    正则表达式及字符处理

    目标文件/etc/passwd,使用grep命令或egrep

    1. 显示出所有含有root的行:
    [root@scott etc]# egrep 'root' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    1. 输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容:
    [root@scott etc]# egrep -C2  'root' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    --
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    1. 显示出有多少行含有nologin。
    [root@scott etc]# egrep -c  'nologin' /etc/passwd
    40
    1. 显示出那些行含有root,并将行号一块输出。
    [root@scott etc]# egrep -nw  'root' /etc/passwd
    1:root:x:0:0:root:/root:/bin/bash
    10:operator:x:11:0:operator:/root:/sbin/nologin
    1. 显示出文件中
    2. 新建用户
      abominable
      abominate
      anomie
      atomize
      编写正则表达式,将他们匹配出来
    [root@scott etc]# egrep 'a[b|n|t]omi*' /etc/passwd
    abominable:x:1207:1208::/home/abominable:/bin/bash
    abominate:x:1208:1209::/home/abominate:/bin/bash
    anomie:x:1209:1210::/home/anomie:/bin/bash
    atomize:x:1210:1211::/home/atomize:/bin/bash
    egrep 'a.omi(nabl|nat|z|)e' /etc/passwd
    
    1. 建四个用户
      Alex213sb
      Wpq2222b
      yH438PIG
      egon666
      egon

      过滤出用户名组成是字母+数字+字母的行

    [root@scott etc]# egrep '[^a-Z][0-9][a-Z$]' /etc/passwd
    Alex213sb:x:1207:1208::/home/Alex213sb:/bin/bash
    Wpq222b:x:1208:1209::/home/Wpq222b:/bin/bash
    yH438PIG:x:1209:1210::/home/yH438PIG:/bin/bash

    [root@MiWiFi-R3-srv ~]# egrep '^[a-Z]+[0-9]+[a-Z]+' /etc/passwd

    1. 显示出/etc目录下所有包含root的文件名
    [root@scott etc]# find -type f -print|grep 'root'
    ./selinux/targeted/contexts/users/root
    ./sysconfig/readonly-root
    ./security/chroot.conf
    ./unbound/root.key
    1. 过滤掉/etc/ssh/sshd_config内所有注释和所有空行
    [root@scott etc]# grep -v '#' /etc/ssh/sshd_config|grep -v '^ *$'
    HostKey /etc/ssh/ssh_host_rsa_key
    HostKey /etc/ssh/ssh_host_ecdsa_key
    HostKey /etc/ssh/ssh_host_ed25519_key
    SyslogFacility AUTHPRIV
    AuthorizedKeysFile  .ssh/authorized_keys
    PasswordAuthentication yes
    ChallengeResponseAuthentication no
    GSSAPIAuthentication yes
    GSSAPICleanupCredentials no
    UsePAM yes
    X11Forwarding yes
    UsePrivilegeSeparation sandbox     
    AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    AcceptEnv XMODIFIERS
    Subsystem   sftp    /usr/libexec/openssh/sftp-server

    标准答案以及结果

    [root@scott etc]# grep -v '^#' /etc/ssh/sshd_config |grep -v '^ *$'
    HostKey /etc/ssh/ssh_host_rsa_key
    HostKey /etc/ssh/ssh_host_ecdsa_key
    HostKey /etc/ssh/ssh_host_ed25519_key
    SyslogFacility AUTHPRIV
    AuthorizedKeysFile  .ssh/authorized_keys
    PasswordAuthentication yes
    ChallengeResponseAuthentication no
    GSSAPIAuthentication yes
    GSSAPICleanupCredentials no
    UsePAM yes
    X11Forwarding yes
    UsePrivilegeSeparation sandbox      # Default for new installations.
    AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    AcceptEnv XMODIFIERS
    Subsystem   sftp    /usr/libexec/openssh/sftp-server
    

    grep -v '^#' /etc/ssh/sshd_config |grep -v '^ *$'

    作业三:Sed作业:以/etc/passwd文件为模板

    1. 删除文件每行的第一个字符。
    [root@scott ~]# sed 's/^[a-Z]//g' /test/dir/multicom.txt
    oot:x:0:0:root:/root:/bin/bash
    in:x:1:1:bin:/bin:/sbin/nologin
    aemon:x:2:2:daemon:/sbin:/sbin/nologin
    dm:x:3:4:adm:/var/adm:/sbin/nologin
    p:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    ync:x:5:0:sync:/sbin:/bin/sync
    hutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    alt:x:7:0:halt:/sbin:/sbin/halt
    ail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    perator:x:11:0:operator:/root:/sbin/nologin
    1. 删除文件每行的第二个字符。
    [root@scott ~]# sed -r 's/(^.)(.)/1/g' /test/dir/multicom.txt
    rot:x:0:0:root:/root:/bin/bash
    bn:x:1:1:bin:/bin:/sbin/nologin
    demon:x:2:2:daemon:/sbin:/sbin/nologin
    am:x:3:4:adm:/var/adm:/sbin/nologin
    l:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    snc:x:5:0:sync:/sbin:/bin/sync
    sutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    hlt:x:7:0:halt:/sbin:/sbin/halt
    mil:x:8:12:mail:/var/spool/mail:/sbin/nologin
    oerator:x:11:0:operator:/root:/sbin/nologin
    
    1. 删除文件每行的最后一个字符。
    [root@scott ~]# sed -r 's/.$//g' /test/dir/multicom.txt
    root:x:0:0:root:/root:/bin/bas
    bin:x:1:1:bin:/bin:/sbin/nologi
    daemon:x:2:2:daemon:/sbin:/sbin/nologi
    adm:x:3:4:adm:/var/adm:/sbin/nologi
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi
    sync:x:5:0:sync:/sbin:/bin/syn
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdow
    halt:x:7:0:halt:/sbin:/sbin/hal
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologi
    operator:x:11:0:operator:/root:/sbin/nologi
    
    1. 删除文件每行的倒数第二个字符。
    [root@scott ~]# sed -r 's/(.)(.$)/2/g' /test/dir/multicom.txt
    root:x:0:0:root:/root:/bin/bah
    bin:x:1:1:bin:/bin:/sbin/nologn
    daemon:x:2:2:daemon:/sbin:/sbin/nologn
    adm:x:3:4:adm:/var/adm:/sbin/nologn
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologn
    sync:x:5:0:sync:/sbin:/bin/syc
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdon
    halt:x:7:0:halt:/sbin:/sbin/hat
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologn
    operator:x:11:0:operator:/root:/sbin/nologn
    1. 删除文件每行的第二个单词。
    [root@scott ~]# sed -r 's/^([a-Z]+)([^a-Z])([a-Z])/12/g' /test/dir/multicom.txt
    root::0:0:root:/root:/bin/bash
    bin::1:1:bin:/bin:/sbin/nologin
    daemon::2:2:daemon:/sbin:/sbin/nologin
    adm::3:4:adm:/var/adm:/sbin/nologin
    lp::4:7:lp:/var/spool/lpd:/sbin/nologin
    sync::5:0:sync:/sbin:/bin/sync
    shutdown::6:0:shutdown:/sbin:/sbin/shutdown
    halt::7:0:halt:/sbin:/sbin/halt
    mail::8:12:mail:/var/spool/mail:/sbin/nologin
    operator::11:0:operator:/root:/sbin/nologin
    
    1. 删除文件每行的倒数第二个单词。
    [root@scott ~]# sed -r 's/([a-Z]+)([^a-Z])([a-Z]+)$/23/g' /test/dir/multicom.txt
    root:x:0:0:root:/root://bash
    bin:x:1:1:bin:/bin://nologin
    daemon:x:2:2:daemon:/sbin://nologin
    adm:x:3:4:adm:/var/adm://nologin
    lp:x:4:7:lp:/var/spool/lpd://nologin
    sync:x:5:0:sync:/sbin://sync
    shutdown:x:6:0:shutdown:/sbin://shutdown
    halt:x:7:0:halt:/sbin://halt
    mail:x:8:12:mail:/var/spool/mail://nologin
    operator:x:11:0:operator:/root://nologin
    
    1. 删除文件每行的最后一个单词。
    [root@scott ~]# sed -r 's/([^a-Z])([a-Z]+)$/1/g' /test/dir/multicom.txt
    root:x:0:0:root:/root:/bin/
    bin:x:1:1:bin:/bin:/sbin/
    daemon:x:2:2:daemon:/sbin:/sbin/
    adm:x:3:4:adm:/var/adm:/sbin/
    lp:x:4:7:lp:/var/spool/lpd:/sbin/
    sync:x:5:0:sync:/sbin:/bin/
    shutdown:x:6:0:shutdown:/sbin:/sbin/
    halt:x:7:0:halt:/sbin:/sbin/
    mail:x:8:12:mail:/var/spool/mail:/sbin/
    operator:x:11:0:operator:/root:/sbin/
    1. 交换每行的第一个字符和第二个字符。
    [root@scott ~]# sed -r 's/^([a-z])([a-z])/21/g' /test/dir/multicom.txt
    orot:x:0:0:root:/root:/bin/bash
    ibn:x:1:1:bin:/bin:/sbin/nologin
    ademon:x:2:2:daemon:/sbin:/sbin/nologin
    dam:x:3:4:adm:/var/adm:/sbin/nologin
    pl:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    ysnc:x:5:0:sync:/sbin:/bin/sync
    hsutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    ahlt:x:7:0:halt:/sbin:/sbin/halt
    amil:x:8:12:mail:/var/spool/mail:/sbin/nologin
    poerator:x:11:0:operator:/root:/sbin/nologin
    
    1. 交换每行的第一个字符和第二个单词。
    [root@scott ~]# sed -r 's/^([a-z])([a-z]+)([^a-z])([a-z]+)/4231/g' /test/dir/multicom.txt
    xoot:r:0:0:root:/root:/bin/bash
    xin:b:1:1:bin:/bin:/sbin/nologin
    xaemon:d:2:2:daemon:/sbin:/sbin/nologin
    xdm:a:3:4:adm:/var/adm:/sbin/nologin
    xp:l:4:7:lp:/var/spool/lpd:/sbin/nologin
    xync:s:5:0:sync:/sbin:/bin/sync
    xhutdown:s:6:0:shutdown:/sbin:/sbin/shutdown
    xalt:h:7:0:halt:/sbin:/sbin/halt
    xail:m:8:12:mail:/var/spool/mail:/sbin/nologin
    xperator:o:11:0:operator:/root:/sbin/nologin
    
    1. 交换每行的第一个单词和最后一个单词。
    [root@scott ~]# sed -r 's/^([a-z]+)([^a-z]+)(.*)([^a-z]+)([a-z]+)$/52341/g' /test/dir/multicom.txt
    bash:x:0:0:root:/root:/bin/root
    nologin:x:1:1:bin:/bin:/sbin/bin
    nologin:x:2:2:daemon:/sbin:/sbin/daemon
    nologin:x:3:4:adm:/var/adm:/sbin/adm
    nologin:x:4:7:lp:/var/spool/lpd:/sbin/lp
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    nologin:x:8:12:mail:/var/spool/mail:/sbin/mail
    nologin:x:11:0:operator:/root:/sbin/operator
    1. 删除一个文件中所有的数字。
    [root@scott ~]# sed -r 's/[0-9]+//g' /test/dir/multicom.txt
    root:x:::root:/root:/bin/bash
    bin:x:::bin:/bin:/sbin/nologin
    daemon:x:::daemon:/sbin:/sbin/nologin
    adm:x:::adm:/var/adm:/sbin/nologin
    lp:x:::lp:/var/spool/lpd:/sbin/nologin
    sync:x:::sync:/sbin:/bin/sync
    shutdown:x:::shutdown:/sbin:/sbin/shutdown
    halt:x:::halt:/sbin:/sbin/halt
    mail:x:::mail:/var/spool/mail:/sbin/nologin
    operator:x:::operator:/root:/sbin/nologin
    
    1. 删除每行开头的所有空格。
    [root@scott ~]# sed -r 's/^ *//g' /test/dir/multicom.txt
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    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
    sync:x:5:0:sync:/sbin:/bin/sync
    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
    operator:x:11:0:operator:/root:/sbin/nologin
    
    1. 用制表符替换文件中出现的所有空格。
    [root@scott ~]# sed -r 's/ /|/g' /test/dir/multicom.txt
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    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
    sync:x:5:0:sync:/sbin:/bin/sync
    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
    operator:x:11:0:operator:/root:/sbin/nologin
    
    1. 把所有大写字母用括号()括起来。
      sed -r 's/[A-Z]/(&)/g' /etc/passwd
      所有数字()
    [root@scott ~]# sed -r 's/[0-9]/(&)/g' /test/dir/multicom.txt
    root:x:(0):(0):root:/root:/bin/bash
    bin:x:(1):(1):bin:/bin:/sbin/nologin
    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
    sync:x:(5):(0):sync:/sbin:/bin/sync
    shutdown:x:(6):(0):shutdown:/sbin:/sbin/shutdown
    halt:x:(7):(0):halt:/sbin:/sbin/halt
    mail:x:(8):(1)(2):mail:/var/spool/mail:/sbin/nologin
    operator:x:(1)(1):(0):operator:/root:/sbin/nologin
    
    1. 打印每行3次。
    [root@scott ~]# sed -r '{p;p}' /test/dir/multicom.txt
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    bin:x:1:1:bin:/bin:/sbin/nologin
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    sync:x:5:0:sync:/sbin:/bin/sync
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    halt:x:7:0:halt:/sbin:/sbin/halt
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    
    1. 只显示每行的第一个单词。
    [root@scott ~]# sed -r 's/^([a-z]+)([^a-z])(.*)/1/g' /test/dir/multicom.txt
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    operator
    

    17.打印每行的第一个单词和第三个单词。

    [root@scott ~]# sed -r 's/^([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/5/g' /test/dir/multicom.txt
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    operator
    1. 用命令获取格式为 mm/yy/dd 的日期格式,结合管道,将其换成 mm;yy;dd格式

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

  • 相关阅读:
    5.19 省选模拟赛 T1 小B的棋盘 双指针 性质
    5.15 省选模拟赛 容斥 生成函数 dp
    5.15 省选模拟赛 T1 点分治 FFT
    5.15 牛客挑战赛40 B 小V的序列 关于随机均摊分析 二进制
    luogu P4929 【模板】舞蹈链 DLX
    CF 878E Numbers on the blackboard 并查集 离线 贪心
    5.10 省选模拟赛 拍卖 博弈 dp
    5.12 省选模拟赛 T2 贪心 dp 搜索 差分
    5.10 省选模拟赛 tree 树形dp 逆元
    luogu P6088 [JSOI2015]字符串树 可持久化trie 线段树合并 树链剖分 trie树
  • 原文地址:https://www.cnblogs.com/scott-lv/p/7487334.html
Copyright © 2020-2023  润新知