Shell子串_变量子串案例_统计字符长度以及命令执行时长

发布时间 2023-10-09 17:51:15作者: WeChat2834
子串案例

shell截取字符串通常由两种方式:从指定位置开始截取和从指定字符开始截取

  • 从指定位置开始截取:这种方式需要两个参数,除了指定的起始位置,还需要截取长度,才能确定要截取的字符串。既然需要指定其实位置,到底是从字符串的左边开始计数,还是从字符串右边开始计数,答案是shell同时支持两种计数方式

    1. 从字符串的左边开始计数;格式如下

      $(string:start:length)
      
      
       
       ~~~bash
       [root@localhost ~]# name="Mrxu160abcbbcacd"
       [root@localhost ~]# echo ${name}
       Mrxu160abcbbcacd
       [root@localhost ~]# echo${#name}
       bash: echo16: 未找到命令...
       [root@localhost ~]# echo ${#name}
       16
       [root@localhost ~]# echo ${name:6』
       > ^C
       [root@localhost ~]# echo ${name:6}
       0abcbbcacd
       [root@localhost ~]# echo ${name:6:3}
       0ab
       
    

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

    1. 方法2
案例2 计算变量长度的各种玩法
  • 多种统计长度的命令

    ###方法1 用wc命令
    [root@localhost ~]# echo $name
    Mrxu160abcbbcacd
    [root@localhost ~]# echo ${#name}
    16
    [root@localhost ~]# echo ${name} |wc -l  ### -l 输出行数
    1
    [root@localhost ~]# echo ${name} |wc -L #### -L统计最长的那一行并统计其长度
    16
    [root@localhost ~]# 
    ##方法2 用expr 的length函数统计
    [root@localhost ~]# expr length ${name}
    16
    [root@localhost ~]# 
    ###方法3 用awk的统计长度,length函数
    [root@localhost ~]# echo "${name}" |awk '{print length($0)}'
    16
    [root@localhost ~]# 
    ###方法4 ,内置命令最快
    [root@localhost ~]# echo ${#name}
    16
    [root@localhost ~]# 
    
  • 统计命令执行时长

    字符串长度的统计方法这么多,谁最快?

    time 命令 ,统计命令执行时长

    for 变量 in 序列 1~100

    do

    ​ 执行的程序

    done

    写在一行的形式

    #写在一行的形式要用分号隔开
    [root@localhost tmp]# for i in {1..10} ; do  echo $i; done
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@localhost tmp]# 
    

    生成序列 命令seq

    [root@localhost tmp]# seq 3   #默认换行分隔符
    1
    2
    3
    [root@localhost tmp]# seq -s ";" 3   #-s 指定分隔符
    1;2;3
    [root@localhost tmp]# 
    
    #简单方法1
    [root@localhost tmp]# for num in {1..3} ; do  var=`seq -s ":" $num`; echo $var ;done
    1
    1:2
    1:2:3
    [root@localhost tmp]# 
    
    ###案例1;通过置命令来统计长度结算时长
    ###  &>/dev/null  将输出信息置入黑洞文件
    [root@localhost tmp]# time  for  num in {1..100} ; do var=`seq -s Mrxu 100`; echo ${#var} &>/dev/null;done
    
    real	0m0.118s   ###表示实际运行的时间
    user	0m0.042s   ###用户态执行的时间
    sys	0m0.045s       ###内核态态执行的时间  
    [root@localhost tmp]# 
    ###案例2;通过wc命令统计;因为用到管道符,效率肯定慢了
    [root@localhost tmp]# time  for  num in {1..100} ; do var=`seq -s Mrxu 100`; echo ${var}|wc -L &>/dev/null;done
    
    real	0m0.291s
    user	0m0.122s
    sys	0m0.135s
    [root@localhost tmp]#
    ###案例3通过expr命令的length函数统计
    [root@localhost tmp]# time  for  num in {1..100} ; do var=`seq -s Mrxu 100`;  expr length ${var} &>/dev/null;done
    
    real	0m0.212s
    user	0m0.092s
    sys	0m0.087s
    [root@localhost tmp]# 
    ###案例4 awk命令处理统计长度
    [root@localhost tmp]# time  for  num in {1..100} ; do var=`seq -s Mrxu 100`;echo ${var}|awk '{print length($0)}' &>/dev/null;done
    
    real	0m0.297s
    user	0m0.124s
    sys	0m0.136s
    [root@localhost tmp]# 
    
    

    shell编程,尽量使用Linux内置的命令,内置的操作,和内置函数,因为这些是C语言开发,效率最高;尽可能的减少管道符的操作。