linux学习

Shell文本处理

正则表达式

  • 正则表达式概述

    • 正则表达式是由一串字符和元字符构成的字符串
  • egrep工具

    • 以行为单位
    • 默认只输出与表达式相匹配的文本行
    格式1:egrep [选项] '正则表达式' 文件... ...
    格式2: 前置命令 | egrep [选项] '正则表达式'
    -i  忽略字母大小写
    -v  条件取反
    -c  统计匹配的行数
    -q  静默、无任何输出,一般用于检测  
        --看 $? 返回值,返回值为0,则说明有匹配,返回值为,则说明无匹配
    -n  显示出匹配结果所在的行号
    --color 标红显示匹配字串
  • 基本元字符

    • 行首尾及单字匹配
    类型 含义 示例 说明
    ^ 匹配行首 ^abc 以abc开头的行
    ^ 匹配行首 ^# 以#号开头的行(比如注释行)
    $ 匹配行首 abc$ 以abc结尾的行
    $ 匹配行首 ^$ 空行
    . 单个字符 . 除换行(\n)以外的任意单个字符
    # 输出以root开头的行
    [root@www ~]# egrep "^root" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    
    # 统计以bash结尾的行
    [root@www ~]# egrep -c "bash$" /etc/passwd
    38
    
    • 未定匹配次数
    类型 含义 示例 说明
    + 最少匹配一次 a+ 一个或多个连续的a
    + 最少匹配一次 (abc)+ 一个或多个连续的abc
    ? 最多匹配一次 a? 0个或1个a
    ? 最多匹配一次 (abc)? 0个或1个abc
    * 匹配任意字数 a* 0个或多个连续的a
    * 匹配任意字数 (abc)* 0个或多个连续的abc
    * 匹配任意字数 .* 任意长度的任意字符
    # 匹配deam,最多匹配一次
    [root@www ~]# egrep "(daem)+" /etc/passwd
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    
    # 创建文件
    [root@www ~]# vim reg.txt
    [root@www ~]# cat reg.txt 
    acd XX
    XX
    abcabcd XX
    
    # 匹配abc,最少匹配两次
    [root@www ~]# egrep '(abc)+' reg.txt
    abcd XX
    abcabcd XX
    
    # 匹配任意字数
    [root@www ~]# egrep '(abc)*' reg.txt
    abcd XX
    XX
    abcabcd XX
    • {}限定次数
    类型 含义 示例 说明
    {n} 匹配n次 (ab){3} 匹配ababab
    {n,m} 匹配n~m次 (ab)(1,3) 匹配ab、abab、ababab
    {n,} 匹配至少n次 (ab){2,} 匹配2及以上个连续的ab
    [root@www ~]# egrep '(abc){2}' reg.txt
    abcabcd XX
    [root@www ~]# egrep '(abc){1}' reg.txt
    abcd XX
    abcabcd XX
    [root@www ~]# egrep '(abc){2}' reg.txt
    abcabcd XX
    [root@www ~]# egrep '(abc){1}' reg.txt
    abcd XX
    abcabcd XX
    [root@www ~]# egrep '(abc){1,3}' reg.txt
    abcd XX
    abcabcd XX
    [root@www ~]# egrep '(abc){2}' reg.txt
    abcabcd XX
    [root@www ~]# egrep '(abc){1,}' reg.txt
    abcd XX
    abcabcd XX
  • 其他元字符

    • []范围内单字匹配
    示例 说明
    [a|c45_?] 匹配 a、|、4、5、_、?
    [a-z] 匹配任意小写字符
    [A-Z] 匹配任意大写字符
    [0-9] 匹配任意数字
    [a-Z0-9] 匹配任意字母或数字
    [^A-Z] 匹配非大写字母的行
    ^ [^a-z] 匹配不以小写字母开头的行
    [root@www ~]# cat reg.txt 
    abcd XX
    XX
    abcabcd XX
    # 不以大写字母开头的行
    [root@www ~]# egrep '[^A-Z]' reg.txt 
    abcd XX
    abcabcd XX
    # 不以小写字母开头的行
    [root@www ~]# egrep '^[^a-z]' reg.txt 
    XX
    • 整体及边界匹配
    类型 含义 示例 说明
    () 组合为整体 (ad){1,3} 匹配:ad,adad,adadad
    | 或者 root|bin 匹配:root, bin
    \b 单词边界 \broot\b 匹配单词:root
    \< 单词开头 \<th 匹配以th开头的单词
    > 单词结束 \<root> 作用与\broot\b一样
    \w 字母数字下划线 \wa 匹配xa,不匹配#a
    \s 匹配空白 /sa 匹配a,不匹配xa
    \d 匹配数字 -P \da 匹配5a,不匹配xa

    注意:其中\为转义字符,可以为一些普通字符赋予特殊含义,或者将一些特殊字符变为普通字符

    # 在/etc/passwd中匹配以root或bin开头的行
    [root@www ~]# egrep '^root|^bin' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    
    # 匹配以abc三个字母为行
    [root@www ~]# cat reg.txt 
    abc
    d XX
    XX
    abcabcd XX
    [root@www ~]# egrep '\' reg.txt 
    abc

sed基本用法

  • sed命令解析

    格式1:sed [选项] '条件指令' 文件... ...
    格式2: 前置命令 | sed [选项] '条件指令'
    -n  屏蔽默认输出,默认sed会输出读取文档的全部内容
    -i  修改文件内容
    -r  启用扩展的正则表达式
    --行号可以使用单个数字或者3,5表示连续多行
    --省略条件,则默认逐行处理全部文本
    --匹配正则时需要使用//
  • 常见处理操作动作

    • 常用操作
    操作符 用途 指令示例
    p 打印行 2,4p 输出2、3、4行
    p 打印行 2p、4p 输出第2行、第4行
    d 删除行 2,4d 删除第2、3、4行
    s 字符串替换 s/old/new/ 每行第一个替换
    s 字符串替换 s/old/new/3 每行第三个替换
    s 字符串替换 s/old/new/g 将所有的都替换
    [root@www ~]# cat abc.txt 
    aa
    the
    thethe
    aaathe
    THE THE
    AAAOOO
    # 输出所有行
    [root@www ~]# sed -n 'p' abc.txt
    aa
    the
    thethe
    aaathe
    THE THE
    AAAOOO
    # 输出文件的行数
    [root@www ~]# sed -n '$=' abc.txt
    6
    # 删除第3~5行
    [root@www ~]# sed '3,5d' abc.txt
    aa
    the
    AAAOOO
    # 删除最后一行
    [root@www ~]# sed '$d' abc.txt
    aa
    the
    thethe
    aaathe
    THE THE
    # 将第4~6行注释
    [root@www ~]# cat -n abc.txt 
       1  aa
       2  the
       3  thethe
       4  aaathe
       5  THE THE
       6  AAAOOO
    [root@www ~]# sed '4,6s/^/#/' abc.txt
    aa
    the
    thethe
    #aaathe
    #THE THE
    #AAAOOO
    • 文本块处理
    操作符 用途 指令示例
    i 行前插入文本 2iYY 在第2行添加文本YY
    i 行前插入文本 4,7iYY 在第4~7行添加文本
    a 行后插入文本 2aYY 在第2行后面添加文本
    a 行后插入文本 /^XX/aYY 在以XX开头的行之后添加文本
    c 替换当前行 2cYY 将第二行的内容修改为YY
    [root@www ~]# cat m.txt
    11111111 Tarena
    222 IT Group
    # 在第二行插入XX
    [root@www ~]# sed '2iXX' m.txt
    11111111 Tarena
    XX
    222 IT Group
    # 在第二行后面插入XX
    [root@www ~]# sed '2aXX' m.txt
    11111111 Tarena
    222 IT Group
    XX
    # 替换第二行的内容为XX
    [root@www ~]# sed '2cXX' m.txt
    11111111 Tarena
    XX

awk应用

  • awk命令解析

    格式1:awk [选项] '[条件]{指令}' 文件... ...
    格式2: 前置命令 | awk [选项] '[条件]{指令}'
    -F 指定分隔符,可省略(默认空格或Tab)
    --其中多条指令语句可以分号分隔,print是最常用的指令
    # 检查内存剩余量
    [root@www ~]# free -m | awk '/Mem/{print $4"M"}'
    238M
    # 过滤网络流量
    [root@www ~]# ifconfig ens160
    ens160: flags=4163  mtu 1500
          inet 192.168.199.128  netmask 255.255.255.0  broadcast 192.168.199.255
          inet6 fe80::20c:29ff:fe35:80d  prefixlen 64  scopeid 0x20
          ether 00:0c:29:35:08:0d  txqueuelen 1000  (Ethernet)
          RX packets 52857  bytes 4466946 (4.2 MiB)
          RX errors 0  dropped 0  overruns 0  frame 0
          TX packets 34976  bytes 5125073 (4.8 MiB)
          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    [root@www ~]# ifconfig ens160 | awk '/inet\>/{print "ip地址为:",$2,"掩码信为:",$4}'
    ip地址为: 192.168.199.128 掩码信息为: 255.255.255.0
  • awk内置变量

    变量 用途
    FS 保存或设置字段分隔符,例如 FS= “:” ,与-F功能一样
    $n 指定分隔的第n个字段,如$1、$3分别表示第一、第三列
    $0 当前读入的整行文本内容
    NF 记录当前处理行的字段个数
    NR 记录当前已读入的数量(行数)
    [root@www ~]# cat m.txt
    11111111 Tarena
    222 IT Group
    # 输出已处理的行和列
    [root@www ~]# awk '{print NR,NF}' m.txt
    1 2
    2 3
  • awk过滤的时机

    • awk执行命令的时机包括:在所有行前、逐行、所有行后。三个时机可单独使用,或者同时一起使用。
    # BEGIN{ } 行前处理,读取文件内容前执行,指令执行1次
    # { } 逐行处理,读取文件过程中执行,指令执行n次
    # END{ } 行后处理,读取文件结束后执行,指令执行1次
    
    [root@svr5 ~]# awk 'BEGIN {print NR} END{print NR}'  m.txt
    0                                        //预处理时,行数为0
    2                                        //全部处理完以后,行数为已读入文本的行数
  • awk处理条件

    • 正则表达式

    条件可以用/正则表达式/ 的方式,与sed类似,其中~ 表示匹配、!~表示 不匹配。

    [root@svr5 ~]# awk -F: '/^ro/{print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash                    //列出以ro开头的用户记录
    • 数值比较
    # == 等于、!= 不等于
    # > 大于、>= 大于或等于
    # < 小于、<= 小于或等于
    
    [root@svr5 ~]# awk 'NF>=2{print}' reg.txt
    abcd XX                  //输出包含2个及以上字段的行
    abcabcd XX
    • 多个条件的组合

    多个条件的组合使用逻辑比较连接,包括以下类型:

    && 逻辑与:期望多个条件都成立

    || 逻辑或:只要有一个条件成立即满足要求

    [root@svr5 ~]# awk -F: '$3>=0&&$3<2{print $1,$3}' /etc/passwd  //列出UID小于2的用户信息
    root 0
    bin 1
    • 变量的运算

    运算符包括以下类型:

    +、-、*、/、%

    ++、-- 、+=、-=、*=、/=

    [root@svr5 ~]# awk  'BEGIN{i=0} {i+=NF} END{print i}'  reg.txt
    5                  //统计文本的总字段个数

一条评论

留言

您的电子邮箱地址不会被公开。 必填项已用 * 标注