shell子串花式用法
# 从头开始删除匹配最短
## 从头开始删除匹配最长
% 从尾开始删除匹配最短的
%% 从尾开始删除匹配最长的
# 指定字符内容截取
a*c 匹配开头为a,中间任意个字符,结尾为c的字符串
${变量} 返回变量值
${#变量} 返回变量长度,字符长度
${变量:start} 返回变量Offset数值之后的字符
${变量:(-start)} 返回变量倒数第n个之后的字符
${变量:start:length} 提取offset之后的length限制的字符
${变量#word} 从变量开头删除最短匹配的word子串
${变量##word} 从变量开头,删除最长匹配的word
${变量%word} 从变量结尾删除最短的word
${变量%%word} 从变量结尾删除最长匹配的word
${变量/pattern/string} 用string代替第一个匹配的pattern
${变量/%pattern/string} 使用%表示除了pattern字符外前面的字符,其中pattern可以使用通配符*
${变量/#pattern/string} 使用#表示以pattern开头的字符,其中pattern可以使用通配符*
${变量//pattern/string} 用string代替所有的pattern
${变量/pattern,,} 将字符串变成小写输出, 也可以使用declare为字符串添加属性,declare -l小写,declare -u大写
${变量/pattern,} 将字符串第一个字符变成小写输出
${变量/pattern^^} 将字符串变成大写输出
${变量/pattern^} 将字符串第一个字符变成大写输出
shell变量字符串截取一般有两种方式:按照指定位置截取和按照名称截取。
展示:
xiao123@xiao123:~/Downloads$ name=yuchao180
xiao123@xiao123:~/Downloads$ echo ${name}
yuchao180
xiao123@xiao123:~/Downloads$ echo ${#name}
9
xiao123@xiao123:~/Downloads$ echo ${name:2} #从第3个字符开始输出
chao180
xiao123@xiao123:~/Downloads$ echo ${name:2:4} #从第3个字符开始输出,输出长度为4
chao
xiao123@xiao123:~/Downloads$ echo ${name#yu} #删除最短匹配的字符
chao180
xiao123@xiao123:~/Downloads$ echo ${name/yu/1yuyu} #替换第一个匹配的字符
1yuyuchao180
xiao123@xiao123:~/Downloads$
xiao123@xiao123:~/Downloads/shscripts$ echo ${name:(-3)}
180
xiao123@xiao123:~/Downloads/shscripts$
xiao123@xiao123:~/Downloads/shscripts$ echo ${name/%80/90}
yuchao190
xiao123@xiao123:~/Downloads/shscripts$ echo ${name/#yuchao/yuchao2}
yuchao2180
xiao123@xiao123:~/Downloads/shscripts$ echo ${name/#chao/yuchao2}
yuchao180
xiao123@xiao123:~/Downloads/shscripts$
xiao123@xiao123:~/Downloads/shscripts$ echo ${name/%o*/O}
yuchaO
xiao123@xiao123:~/Downloads/shscripts$ echo ${name/#*chao/yuchao2}
yuchao2180
xiao123@xiao123:~/Downloads/shscripts$
xiao123@xiao123:~/Downloads/shscripts$ echo ${name^}
Yuchao180
xiao123@xiao123:~/Downloads/shscripts$ echo ${name^^}
YUCHAO180
xiao123@xiao123:~/Downloads/shscripts$
实践命令
wc命令
统计文件行数和字符串长度。
-L 统计文件中最长的一行的字符长度,也可以统计字符串长度。
xiao123@xiao123:~/Downloads$ echo ${name} | wc -L
9
xiao123@xiao123:~/Downloads$
-l 统计文件有多行
xiao123@xiao123:~/Downloads$ echo ${name/yu/1yuyu} | wc -l
1
xiao123@xiao123:~/Downloads$
expr命令
length
选项:计算字符串长度
xiao123@xiao123:~/Downloads$ expr length ${name}
9
xiao123@xiao123:~/Downloads$
awk命令
内置函数length(arg)
也可以统计命令行参数长度。
xiao123@xiao123:~/Downloads$ echo ${name} | awk '{print length($0)}' #其中$0表示一行全部字符
9
xiao123@xiao123:~/Downloads$
time命令
统计命令执行时间长度。
seq命令
生成序列的命令
xiao123@xiao123:~/Downloads$ seq 10
1
2
3
4
5
6
7
8
9
10
xiao123@xiao123:~/Downloads$
xiao123@xiao123:~/Downloads$ seq -s ":" 10
1:2:3:4:5:6:7:8:9:10
xiao123@xiao123:~/Downloads$
实验 字符串统计耗时
方法1
xiao123@xiao123:~/Downloads$ time for i in {0..10000}; do char=`seq -s "------" 100`;echo ${#char} &>/dev/null; done
real 0m6.921s # 实际运行的时间
user 0m5.377s # 用户态执行的时间
sys 0m1.784s # 内核态执行的时间
xiao123@xiao123:~/Downloads$
方法2
xiao123@xiao123:~/Downloads$ time for i in {0..10000}; do char=`seq -s "------" 100`;echo ${char}|wc -L &>/dev/null; don
e
real 0m16.516s
user 0m13.143s
sys 0m4.225s
xiao123@xiao123:~/Downloads$
方法3
xiao123@xiao123:~/Downloads$ time for i in {0..10000}; do char=`seq -s "------" 100`;expr length ${char} &>/dev/null; do
ne
real 0m13.177s
user 0m10.556s
sys 0m3.154s
xiao123@xiao123:~/Downloads$
方法4
xiao123@xiao123:~/Downloads$ time for i in {0..10000}; do char=`seq -s "------" 100`;echo ${char}|awk '{print length($0)
}' &>/dev/null; done
real 0m16.913s
user 0m13.565s
sys 0m4.245s
xiao123@xiao123:~/Downloads$
总结
shell编程,尽量使用Linux内置的命令,内置的操作,和内置的函数,效率最高。因为这个工具都是由C语言开发,效率最高,尽可能减少管道符的操作。