zoukankan      html  css  js  c++  java
  • sed grep awk用法

    grep

    grep 是linux 中最常用的“文本处理工具之一” 与sed awk 合称为linux中的三剑客!

    grep 就像你在windows中打开txt文件,使用快捷键“Ctrl+F” 在文本中查找某个字符串一样,可以把grep 理解为字符查找工具

    grep 的全程为Global search Regular Expression  and Print out the line 为全局搜索的意思

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    -i:在搜索的时候忽略大小写
    [root@localhost ~]# cat /etc/passwd|grep -i "SSH"
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     
    -n: 显示结果所在行号
    [root@localhost ~]# cat /etc/passwd|grep -ni "SSH"
    17:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     
    -c:统计匹配到的行数
    [root@localhost ~]# cat /etc/passwd|grep  "root"
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    [root@localhost ~]# cat /etc/passwd|grep -c "root"
    2
     
    -w:匹配单个单词,如果字符串中包含这个单词,则不匹配
    [root@localhost ~]# cat /etc/passwd.bak|grep -w "root"
    root:x:0:0:root:/root:/bin/bash
    rootroo:x:0:0:root:/root:/bin/bash #不会显示rootroo的
     
    -e:实现多个选项的匹配。逻辑或or的关系
    ==egrep
    ==grep -E
    [root@localhost ~]# cat /etc/passwd.bak|egrep -w "root|sshd"
    root:x:0:0:root:/root:/bin/bash
    rootroo:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
     
    -q: 静默模式,不输出任何信息 判断:echo $?
    [root@localhost ~]# cat /etc/passwd.bak|grep -q "root"
     
    -v:输出不带关键字的行(反向查询,反向匹配)
    [root@localhost ~]# cat /etc/passwd.bak|grep -v "root"
    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
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin

     sed

    流编辑器,主要用来过滤和替换文本内容

    工作原理:sed命令将当前处理的行读入模式空间进行处理,处理完把结果输出,并清空模式。然后再将下一行读入模式空间进行处理输出,以此类推,直至最后一行。

    用法:

    sed [选项] ‘命令’ file_name

    选项:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    参数说明:
     
        -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
        -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
        -h或--help 显示帮助。
        -n或--quiet或--silent 仅显示script处理后的结果。
        -V或--version 显示版本信息。
     
    动作说明:
     
        a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
        c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
        d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
        i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
        p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
        s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

     awk

    awk 是一个优良的文本处理工具。(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)

    语法:awk 'pattern {action}'  file_name

    其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令

    1
    [root@localhost ~]# awk '{print $0}' /etc/passwd<br>root:x:0:0:root:/root:/bin/bash<br>bin:x:1:1:bin:/bin:/sbin/nologin<br>daemon:x:2:2:daemon:/sbin:/sbin/nologin<br><br>

     print 是打印命令  $0 是代表当前行

    awk 会根据空格和制表符,将每一行分成若干字段,一次用$1,$2,$3代表第一个字段,第二个字段,第三个字段

    -F 指定分隔符为冒号

    1
    2
    3
    4
    5
    6
    7
    8
    [root@localhost ~]# awk -F ':' '{print $1,$2}' /etc/passwd
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown

     awk 常用变量

    NF:表示最后一个字段

    1
    2
    3
    4
    5
    6
    [root@localhost ~]# awk -F ':' '{print $NF}' /etc/passwd
    /bin/bash
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin
    /sbin/nologin

     $(NF-1):表示倒数第二个字段

    1
    2
    3
    4
    5
    6
    [root@localhost ~]# awk -F ':' '{print $(NF-1)}' /etc/passwd
    /root
    /bin
    /sbin
    /var/adm
    /var/spool/lpd

     NR:表示当前处理的是第几行

     输出第二行

    1
    2
    [root@localhost ~]# awk -F ":" 'NR==2 {print}' /etc/passwd
    bin:x:1:1:bin:/bin:/sbin/nologin

    输出第三行以后的行

    1
    2
    3
    4
    5
    [root@localhost ~]# awk -F ':' 'NR>3 {print}' /etc/passwd
    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

     awk 内置函数

    toupper()用于将字符转为大写【t^ber】

    1
    2
    3
    4
    5
    6
    [root@localhost ~]# awk -F ':' '{print toupper($1)}' /etc/passwd
    ROOT
    BIN
    DAEMON
    ADM
    LP

     tolower()用于将字符串转为小写

    1
    2
    3
    4
    5
    6
    [root@localhost ~]# awk -F ':' '{print toupper($1)}' /etc/passwd >/tmp/aa.txt
    [root@localhost ~]# awk '{print tolower($1)}' /tmp/aa.txt
    root
    bin
    daemon
    adm

     awk 允许指定输出条件,只输出符合条件的行

    打印包含root的行

    1
    2
    3
    [root@localhost ~]# awk '/root/ {print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

     输出第一个字段等于指定值的行

    1
    2
    [root@localhost ~]# awk -F ':' '$1=="root" {print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash

     awk if else语句

    假如$1==root 打印第一个字段,否则打印第二个字段

    1
    2
    3
    4
    5
    6
    [root@localhost ~]# awk -F : '{if ($1=="root") print $1;else print $2}' /etc/passwd
    root
    x
    x
    x
    x

     awk 高级用法BEGIN END

    任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。

    因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果

    数字求和

    1
    seq 10|awk '{sum+=$0} END {print sum}'
    1
    2
    3
    4
    5
    6
    7
    8
    9
    例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段):
     
    cat sx
     
    一:50件:200.00
     
    二:60件:300.00
     
    三:70件:400.00
    1
    2
    3
    4
    5
    6
    7
    8
    [root@localhost ~]# awk 'BEGIN {FS=":";print "统计销售金额";total=0} {print $3;total=total+$3;} END {printf "销售金额总计: %.2f ",total}' sx
    统计销售金额
    200.00
     
    300.00
     
    400.00
    销售金额总计: 900.00
  • 相关阅读:
    Python变量、标识符
    PyCharm中设置作者信息
    去中心化
    复杂逻辑---取数
    行政机构处理
    2020.11案例分析
    中间表
    软考--项目管理名词
    软考--近6次上午考点分析
    软考--学习方法、做题方法
  • 原文地址:https://www.cnblogs.com/tyk3201/p/11970773.html
Copyright © 2011-2022 走看看