zoukankan      html  css  js  c++  java
  • linux学习21 运维核心节能-egrep进阶及文本处理工具应用

    一、egrep

      1、grep:基本正则表达式,使用grep -E可支持扩展正则表达式

        egrep:扩展正则表达式,使用egrep -G可以使用基本正则表达式

        fgrep:不支持正则表达式

      2、egrep支持扩展的正则表达式实现类似于grep文本过滤功能,grep -E

        a、选项

          -i,-o,-v,-q,-A,-B,-C

          -G:支持基本正则表达式

      3、扩展正则表达式的元字符

        a、字符匹配

          .:任意单个字符

          []:指定范围内的任意单个字符

          [^]:指定范围外的任意单个字符

        b、次数匹配

          *:任意次,0,1或多次

          ?:0次或1次,其前的字符是可有可无的

          +:其前字符至少1次

          {m}:其前的字符m次

          {m,n}:至少m次,至多n次

            {0,n}

            {m,}

        c、位置锚定

          ^:行首锚定

          $:行尾锚定

          <,:词首锚定

          >,:词尾锚定

        d、分组及引用

          ():分组,括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中

          后向引用:1,2

        e、或

          a|b:a或者b

            C|cat :匹配C或cat

            (c|C)at:匹配cat或Cat

      4、练习

        (1)、找出/proc/meminfo文件中所有以大写或小写s开头的行;至少有三种实现方式

    [root@node1 ~]# cat /proc/meminfo |grep -i "^[sS]"
    SwapCached:            0 kB
    SwapTotal:       2097148 kB
    SwapFree:        2097148 kB
    Shmem:              8872 kB
    Slab:             236396 kB
    SReclaimable:     167468 kB
    SUnreclaim:        68928 kB
    [root@node1 ~]# cat /proc/meminfo |grep -i "^S"
    SwapCached:            0 kB
    SwapTotal:       2097148 kB
    SwapFree:        2097148 kB
    Shmem:              8872 kB
    Slab:             236396 kB
    SReclaimable:     167468 kB
    SUnreclaim:        68928 kB
    [root@node1 ~]# cat /proc/meminfo |grep  "^[sS]"
    SwapCached:            0 kB
    SwapTotal:       2097148 kB
    SwapFree:        2097148 kB
    Shmem:              8872 kB
    Slab:             236396 kB
    SReclaimable:     167468 kB
    SUnreclaim:        68928 kB
    [root@node1 ~]# cat /proc/meminfo |grep -E "^(s|S)"
    SwapCached:            0 kB
    SwapTotal:       2097148 kB
    SwapFree:        2097148 kB
    Shmem:              8872 kB
    Slab:             236396 kB
    SReclaimable:     167468 kB
    SUnreclaim:        68928 kB

        (2)、显示当前系统上root、centos或user1用户的相关信息

    [root@node1 ~]# cat /etc/passwd|grep -E "^(root|centos|user1)>"
    root:x:0:0:root:/root:/bin/bash
    centos:x:5002:5002::/home/centos:/bin/bash
    user1:x:5010:5011::/home/user1:/bin/csh

        (3)、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行

    [root@node1 ~]# cat /etc/rc.d/init.d/functions |grep -E "[[:alnum:]]+()"
    checkpid() {
    __kill_pids_term_kill_checkpids() {
    __kill_pids_term_kill() {
    __pids_var_run() {
    __pids_pidof() {
    daemon() {
    killproc() {
    pidfileofproc() {
    pidofproc() {
    ...

        (4)、使用echo命令输出一绝对路径,使用egrep取出其基名

    [root@node1 ~]# echo "/etc/sysconfig" |grep -Eo "[^/]+$"
    sysconfig

          进一步:取出其路径名;类似于对其执行dirname命令的结果

        (5)、找出ifconfig命令结果中的1-255之间的数值

    [root@node1 ~]# ifconfig |grep -E -o "<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>"

        (6)、课外作业:找出ifconfig命令结果中的IP地址

        (7)、添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行

    [root@node1 ~]# useradd bash
    [root@node1 ~]# useradd basher
    [root@node1 ~]# useradd -s /sbin/nologin nologin
    [root@node1 ~]# useradd testbash
    [root@node1 ~]# usermod -s /bin/bash bash
    [root@node1 ~]# usermod -s /bin/bash basher 
    [root@node1 ~]# usermod -s /bin/bash testbash 
    [root@node1 ~]# tail -4 /etc/passwd
    bash:x:5012:5013::/home/bash:/bin/bash
    basher:x:5013:5014::/home/basher:/bin/bash
    nologin:x:5015:5016::/home/nologin:/sbin/nologin
    testbash:x:5016:5017::/home/testbash:/bin/bash
    [root@node1 ~]# grep -E "^([^:]+>).*1$" /etc/passwd
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    bash:x:5012:5013::/home/bash:/bin/bash
    nologin:x:5015:5016::/home/nologin:/sbin/nologin

    二、fgrep:不支持正则表达式元字符

      1、当无需用到元字符去编写模式时,使用fgrep性能更好

    三、文本查看及处理工具

      1、wc:word count

        wc [OPTION]... [FILE]...
        wc [OPTION]... --files0-from=F

    [root@node1 ~]# wc /etc/fstab 
     11  54 465 /etc/fstab  #依次是11行,54个单词,465个字节,文件名称

        a、选项参数

          -l:lines:仅显示行数

          -w:words:显示单词数

          -c:bytes:显示字节数

      2、cut

        cut OPTION... [FILE]...

        a、选项

          -d CHAR:以指定的字符为分隔符

            以:分割只显示/etc/passwd文件中的第一和第七个字段,可以-d:也可以 -d :

    [root@node1 ~]# cut -d: -f1,7 /etc/passwd
    root:/bin/bash
    bin:/sbin/nologin
    daemon:/sbin/nologin
    adm:/sbin/nologin
    ...

          -f  FIELDS:挑选出的字段:

            #:指定的单个字段

            #-#:连续的多个字段

            #,#:离散的多个字段

    [root@node1 ~]# cut -d: -f1,3-5,7 /etc/passwd
    [root@node1 ~]# wc -l /etc/rc.d/init.d/functions |cut -d " " -f1
    691

      3、sort  

        sort [OPTION]... [FILE]...
        sort [OPTION]... --files0-from=F

        a、选项

          -n:基于数值大小进行排序而非字符

    [root@node1 ~]# cut -d: -f3 /etc/passwd |sort -n 

          -t CHAR:指定分隔符

          -k #:用于排序比较的字段

    [root@node1 ~]# sort -t: -k 3 -n /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
    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
    ...

          -r:逆序排序

          -f:忽略字符大小写

          -u:重复的行只保留一份;

            重复行指连续且相同

    [root@node1 ~]# cut -d: -f7 /etc/passwd|sort -u
    /bin/bash
    /bin/csh
    /bin/sh
    /bin/sync
    /bin/tcsh
    /sbin/halt
    /sbin/nologin
    /sbin/shutdown
    [root@node1 ~]# cut -d: -f7 /etc/passwd|sort -u|wc -l
    8

      4、uniq:也就是sort -u中的u。报告或移除重复的行。

          uniq [OPTION]... [INPUT [OUTPUT]]

        a、相应参数

          -c:统计每一行重复出现的次数

    [root@node1 ~]# cut -d: -f7 /etc/passwd|sort |uniq -c
         11 /bin/bash
          2 /bin/csh
          1 /bin/sh
          1 /bin/sync
          1 /bin/tcsh
          1 /sbin/halt
         25 /sbin/nologin
          1 /sbin/shutdown

          -u:只显示不存在重复行的行

    [root@node1 ~]# cut -d: -f7 /etc/passwd|sort |uniq -c
         11 /bin/bash
          2 /bin/csh
          1 /bin/sh
          1 /bin/sync
          1 /bin/tcsh
          1 /sbin/halt
         25 /sbin/nologin
          1 /sbin/shutdown
    [root@node1 ~]# cut -d: -f7 /etc/passwd|sort |uniq -u
    /bin/sh
    /bin/sync
    /bin/tcsh
    /sbin/halt
    /sbin/shutdown

          -d:仅显示重复过的行

      5、diff:用来比较两个文件的不同之处 

        diff [OPTION]... FILES

        diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO/PATCH_FILE

          -u:使用unfied机制,即显示要修改的上下文,默认为3行

    [root@node1 ~]# diff fstab fstab.new 
    1c1  #第一行
    <    #第一个文件与第二个文件比较需要删除的为空
    ---
    > ### #第一个文件与第二个文件比较需增加三个#号
    [root@node1 ~]# diff fstab fstab.new 
    1,3c1  #1到三行应该增加和删除如下内容
    < wohaoshuai1
    < wohaoshuai2
    < wohaoshuai3
    ---
    > ###
    14d11   #14行应该增加如下内容
    < wohaoshuai$

      6、patch:将diff的差异进行补丁

        patch [OPTIONS] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE

        patch /PATCH/TO/OLDFILE < /PATH/TO/PATCH_FILE

    [root@node1 ~]# cat fstab
    wohaoshuai1
    wohaoshuai2
    wohaoshuai3
    #
    # /etc/fstab
    # Created by anaconda on Tue Jun  4 22:30:32 2019
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/centos-root /                       xfs     defaults        0 0
    UUID=fd514a18-84be-4460-8130-706b3ec88673 /boot                   xfs     defaults        0 0
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
    wohaoshuai$
    [root@node1 ~]# diff fstab fstab.new > fstab.patch #将差异保存至fstab.patch
    [root@node1 ~]# patch -i fstab.patch fstab  #将fstab.patch的差异补丁至fstab文件
    patching file fstab
    [root@node1 ~]# cat fstab #可以看到fstab文件内容和fstab.new文件内容一样了
    ###
    #
    # /etc/fstab
    # Created by anaconda on Tue Jun  4 22:30:32 2019
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/centos-root /                       xfs     defaults        0 0
    UUID=fd514a18-84be-4460-8130-706b3ec88673 /boot                   xfs     defaults        0 0
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
    [root@node1 ~]# cat fstab.new 
    ###
    #
    # /etc/fstab
    # Created by anaconda on Tue Jun  4 22:30:32 2019
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/centos-root /                       xfs     defaults        0 0
    UUID=fd514a18-84be-4460-8130-706b3ec88673 /boot                   xfs     defaults        0 0
    /dev/mapper/centos-swap swap                    swap    defaults        0 0

        我们现在发现打了补丁后文件不对,然后我们将补丁还原回去

    [root@node1 ~]# patch -R -i fstab.patch fstab
    patching file fstab
    [root@node1 ~]# cat fstab  #可以看到又还原回来了
    wohaoshuai1
    wohaoshuai2
    wohaoshuai3
    #
    # /etc/fstab
    # Created by anaconda on Tue Jun  4 22:30:32 2019
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/centos-root /                       xfs     defaults        0 0
    UUID=fd514a18-84be-4460-8130-706b3ec88673 /boot                   xfs     defaults        0 0
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
    wohaoshuai$

      7、练习

        (1)、取出ifconfig eno167777736命令结果中的ip地址

  • 相关阅读:
    记一道有趣的数学题
    BJOI2018 二进制
    BJOI2016 IP地址
    BJOI2016 回转寿司
    BJOI2017 开车
    BJOI2019 光线
    java 下载
    springboot 运行相关命令
    sql mapper 里面 Integer 类型判断
    springboot 访问jar同级别下的文件访问问题
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/12094039.html
Copyright © 2011-2022 走看看