zoukankan      html  css  js  c++  java
  • 计算机基础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;">

  • 相关阅读:
    如何将一个类改造为线程安全
    50行代码实现缓存,JAVA内存模型原理
    Qt 解压/压缩文件
    QT学习笔记—1
    在http编程的门口飞牛网自动下单,查单
    QList 排序
    Qt 打开指定的文件
    spoj 375 query on a tree 题解
    uva 11388 GCD LCM题解
    uva 1476 Error Curves 题解
  • 原文地址:https://www.cnblogs.com/scott-lv/p/7487334.html
Copyright © 2011-2022 走看看