linux shell 入门学习笔记11 shell子串

文章详细介绍了Shell中对字符串进行操作的各种方法,包括从头尾删除匹配子串的最短和最长模式,以及基于变量的字符串截取、替换和转换大小写的语法。同时,通过示例展示了不同方法(如wc、expr和awk命令)统计字符串长度的性能差异,强调在Shell编程中应优先使用内置命令以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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语言开发,效率最高,尽可能减少管道符的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值