• linux shell字符串截取的详细总结(实用!)


    摘自:https://www.jb51.net/article/257063.htm

     更新时间:2022年07月27日 15:55:23   作者:悟空悟道  
     
    在开发的时候经常会自行写一些小的脚本,其中就用到截取字符串的操作,这篇文章主要给大家介绍了关于linux shell字符串截取的详细方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
     

    一、字符串变量的截取操作

    对字符串变量的截取操作一般都是通过${操作符}的方式进行,如下:

    1.从指定位置(index)截取固定长度

    格式:${string:start:length}

    其中,string 是要截取的字符串,start 是起始位置(下标从 0 开始计数),length 是要截取的长度(省略的话表示直到字符串的末尾)

    例如:

    1
    2
    3
    4
    5
    str_time='2022-02-01 12:30:58'
    date_no=${str_time:0:10}          #截取前面10位字符:2022-01-01
    date_mon=${str_time:5:2}         #从前面第6位开始截取2位字符:02
    date_time=${str_time:0-8}         #截取后面8位字符:12:30:58
    date_hh=${str_time:0-8:2}         #截取后面8位字符的前面两位:12

    2.截取指定字符串(子字符串)左边的字符

    格式1:${string%substr*}                          #匹配从右往左第一个substr

    格式2:${string%%substr*}                       #匹配从右往左最后一个substr

    说明:上面%的运算实际上可以理解为,删除substr以及substr右边的任意字符串,*号在substr右边,从而得到substr左边剩余字符串。  格式1和格式2的区别是匹配substr的位置

    例如:

    1
    2
    3
    v_str='/app/logs/133.38.112.177_202204111015.log'
    echo ${v_str%/*}              #截取从右往左第一个'/' 左边的字符:/app/logs
    echo ${v_str%%/*}           #截取从右往左最后个'/' 左边的字符:空

    3.截取指定字符串(子字符串)右边的字符

    格式1:${string#*substr}                          #匹配从左往右第一个substr

    格式2:${string##*substr}                        #匹配从左往右最后一个substr

    说明:上面'#'的运算实际上可以理解为,删除substr以及substr左边的任意字符串,*号在substr的左边,从而得到substr右边剩余字符串。  格式1和格式2的区别是匹配substr的位置

    例如:

    1
    2
    3
    4
    5
    v_str='/app/logs/133.38.112.177_202204111015.log'
    #截取从左往右第一个'/' 右边的字符:app/logs/133.38.112.177_202204111015.log
    echo ${v_str#*/}
    #截取从左往右最后个'/' 右边的字符:133.38.112.177_202204111015.log
    echo ${v_str##*/}

    注意:用%和#截取字符串的用法,比较容易忘记容易混淆。

    有个小技巧加以区别

    键盘上#号在$符号的左边,所以是操作并删除左边字符,所以*在substr左边,一个#号代表取第一个substr(从左往右):${string#*substr}

    键盘上%号在$符号的右边,所以是操作并删除右边字符,所以*在substr的右边,一个%代表取第一个substr(从右往左):${string%substr*} 

    二、用cut命令截取(适合处理管道流或行文本字符)

    格式:cut OPTION... [FILE]

    cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

    如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

    OPTION:

    • -b :以字节为单位选取指定的字节数
    • -c :以字符为单位选取指定的字符数
    • -d :指定分隔符(默认是tab)将字符串分为多个区域,一般与-f参数一起使用
    • -f :与-d一起使用,指定选取哪个区域
    • -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除

    用法:

    例如:处理test.txt文件,截取每一行的指定字符

    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
    cat test.txt 
    a_202204110214_10.251.82.225
    b_202204110215_10.251.82.223
    b_202204110212_10.251.82.226
    c_202204110214_10.251.82.228
     
    -b选项:
     
    $ cut -b 1,3 test.txt   #截取1,3字节
     
    a2
    b2
    b2
    c2
     
    $ cut -b 1-3 test.txt   #截取1到3字节
     
    a_2
    b_2
    b_2
    c_2
     
    -c选项:
     
    $ cut -c 1,3 test.txt   #截取1,3字符
     
    a2
    b2
    b2
    c2
     
    $ cut -c 1-3 test.txt   #截取1到3字符
     
    a_2
    b_2
    b_2
    c_2
     
    -d -f选项:
     
    $ cut -d'_' -f3 test.txt   #以下划线分割,取第三个区域字符
     
    10.251.82.225
    10.251.82.223
    10.251.82.226
    10.251.82.228
     
    $ cat test.txt | cut -d'_' -f3   #结合管道使用效果一样

    补充:使用%和%%:截取的是指定字符前边内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    val=“hello++world++shell”
     
    echo ${val%++*}
    # 删除最后一个 ++ 后边字符,截取前边剩下的内容
    # 输出: hello++world
     
    echo ${val%%++*}
    # 删除第一个 ++ 后边字符,只截取保留第一个 ++ 前边的内容
    # 输出: hello 

    示例 截取文件名字,去掉后缀

    1
    2
    3
    4
    5
    str_file="123.hello.json"
     
    echo ${str_file%.*}
    # 删除最后一个 . 后边的json,截取123.hello
    # 输出: 123.hello
  • 相关阅读:
    Notepad++语言格式设置,自定义扩展名关联文件格式
    Windows使用SSH Secure Shell实现免密码登录CentOS
    如何从jks文件中导出公私钥
    tomcat运行监控脚本,自动启动
    2016年统计用区划代码和城乡划分代码(截止2016年07月31日)
    jquery动态出操作select
    阿里负载均衡的一个坑~~~备忘
    神奇的空格
    centos安装tomcat7.0.70
    驱动相关的内核函数分析
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/16880850.html
Copyright © 2020-2023  润新知