linux shell 字符串长度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhang_referee/article/details/83573253

本篇内容主要包括以下内容:

  1.    获取字符串长度的方法
  2.    各方法间性能比较
  3.    相关内容补充

说明:本篇内容为学习shell  编程(老男孩教程) 笔记,部分内容为相关视频课程内容,补充部分是我查资料所得,方便理解学习。有需要老男孩shell 编程视频教程的同学,可以在评论区回复。

   1.获取字符串长度

         首先做个示例数据出来:

zhang@zhang-virtual-machine:~$ vars=`seq -s " "  100`
zhang@zhang-virtual-machine:~$ echo $vars
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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
zhang@zhang-virtual-machine:~$ 

至于这里涉及到的seq 命令,会在第三部分(相关内容补充中会详细说到)。

        1.使用字符串长度获取${#var} 

zhang@zhang-virtual-machine:~$ echo ${#vars}
291
zhang@zhang-virtual-machine:~$ 

         2.使用wc 方法

zhang@zhang-virtual-machine:~$ echo $vars | wc -m
292
zhang@zhang-virtual-machine:~$ 

     注:使用这种方法统计出来的字符串长度要比实际字符长度多1。wc 命令会在后面介绍到。

     3. 使用$(expr length "$var") 方法

zhang@zhang-virtual-machine:~$ echo $(expr length "$vars")
291
zhang@zhang-virtual-machine:~$ 

2.性能比较

    

zhang@zhang-virtual-machine:~$ time for i in $(seq 10000);do count=`echo ${#vars}` ;done;

real	0m11.540s
user	0m0.308s
sys	0m3.764s
zhang@zhang-virtual-machine:~$ time for i in $(seq 10000) ;do count=`echo $vars | wc -m` ;done

real	0m44.385s
user	0m0.480s
sys	0m5.852s
zhang@zhang-virtual-machine:~$ time for i in $(seq 10000);do count=`echo expr length "${chars}"`;done;

real	0m11.681s
user	0m0.204s
sys	0m3.908s
zhang@zhang-virtual-machine:~$ 

我们看到速度相差几倍(我这里数量级不大,试过好多次,一开始是从一百万开始测试的,结果有点慢,就折中了下),这里数量不大,差异不明显。一般情况调用外部命令处理,与内置功能操作性能相差较大。在shell 编程中,我们应尽量用内置操作或函数完成。

3.相关内容补充

    1.seq  

这里说下seq 命令的man 结果:

    

选项比较少:

  • -f, --format=格式        使用printf 样式的浮点格式
  • -s, --separator=字符串   使用指定字符串分隔数字(默认使用:\n)
  • -w, --equal-width        在列前添加0 使得宽度相同

%后面指定数字的位数 默认是%g,%3g那么数字位数不足部分是空格。

zhang@zhang-virtual-machine:~$ seq -f "str%3g" 1 10
str  1
str  2
str  3
str  4
str  5
str  6
str  7
str  8
str  9
str 10
zhang@zhang-virtual-machine:~$ seq -f "str%03g" 1 10
str001
str002
str003
str004
str005
str006
str007
str008
str009
str010
zhang@zhang-virtual-machine:~$ seq -f "str%03g" 90 100
str090
str091
str092
str093
str094
str095
str096
str097
str098
str099
str100
zhang@zhang-virtual-machine:~$ 

-w选项:指定输出数字同宽

zhang@zhang-virtual-machine:~$ seq -w 1 10
01
02
03
04
05
06
07
08
09
10
zhang@zhang-virtual-machine:~$ 

-s选项:指定分隔符(默认是回车)

zhang@zhang-virtual-machine:~$ seq -s " | " 1 10
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
zhang@zhang-virtual-machine:~$ seq -s " | " -f "str%03g" 9 11
str009 | str010 | str011
zhang@zhang-virtual-machine:~$ 

2.wc  

还是一样,先直接上man wc 结果

  

-c或--bytes或——chars:只显示Bytes数

-l或——lines:只显示列数

-w或——words:只显示字数
zhang@zhang-virtual-machine:~$ cat /etc/passwd | wc 
     37      59    1968
zhang@zhang-virtual-machine:~$ cat /etc/passwd | wc -c
1968
zhang@zhang-virtual-machine:~$ cat /etc/passwd | wc -m
1968
zhang@zhang-virtual-machine:~$ cat /etc/passwd | wc -w
59
zhang@zhang-virtual-machine:~$ cat /etc/passwd | wc -l
37
zhang@zhang-virtual-machine:~$ 

3.time

time 命令用来统计给定命令(或程序)运行时间和系统资源消耗情况。

这个命令的详细参数及例子,我推荐这个:http://www.runoob.com/linux/linux-comm-time.html

expr 这个命令,通过man expr 后可以看到,是执行表达式的。

这个命令由于在 shell 编程中使用的比较多,会在后续新写一篇文章来说一下,简单的可以参考下这个:http://www.runoob.com/linux/linux-comm-expr.html

猜你喜欢

转载自blog.csdn.net/zhang_referee/article/details/83573253