截取
按照下标截取
#截取字符串
[abc@centos ~]$ echo $name
adfafdsaf
#从第三位开始,截取五个字符
[abc@centos ~]$ echo ${name:3:5}
afdsa
内容删除
[abc@centos ~]$ name="abc123ABC456abc"
#从字符串前面开始,删掉短的"a*c"
[abc@centos ~]$ echo ${name#a*c}
123ABC456abc
#删掉长的"a*c"
[abc@centos ~]$ echo ${name##a*b}
c
"#“和”%"区别:
- “#”:从前面开始删除
- “%”:从后面开始删除
[abc@centos ~]$ echo ${name}
abc123ABC456abc
#错误示范
[abc@centos ~]$ echo ${name%b*a}
abc123ABC456abc
[abc@centos ~]$ echo ${name%%b*a}
abc123ABC456abc
[abc@centos ~]$ echo ${name}
abc123ABC456abc
#从后面开始找短的"a*c"去掉
[abc@centos ~]$ echo ${name%a*c}
abc123ABC456
#从后面开始找长的"a*c"去掉
[abc@centos ~]$ echo ${name%%a*c}
替换
[abc@centos ~]$ str="hhha"
[abc@centos ~]$ echo ${str/h/boy}
boyhha
[abc@centos ~]$ echo ${str//h/boy}
boyboyboya
统计长度
“#”
#联想特殊变量"$#"可以统计传递给脚本的参数个数,"$0","$1"...都代表一个参数;可以想到"$"代表变量,"#"代表个数
#定义变量测试的变量name,后面不再定义
[abc@centos ~]$ name="adfafdsaf"
[abc@centos ~]$ echo ${#name}
9
wc
参数 | 用法 | 记忆 |
---|---|---|
-l | 统计行数 | line |
-L | 打印最长行的长度 | 大写的“l”,大(长)行 |
#创建一个测试文件
[abc@centos ~]$ vim test.txt
[abc@centos ~]$ cat test.txt
11aa
aaaaa
aaaaaa
#三行
[abc@centos ~]$ cat test.txt | wc -l
3
#最长行长度为6
[abc@centos ~]$ cat test.txt | wc -L
6
expr
[abc@centos ~]$ expr length "${name}"
9
awk
[abc@centos ~]$ echo "${name}" | awk '{print length($0)}'
9
统计命令执行时长
#通过time命令统计"#"执行时长
[abc@centos ~]$ time for n in {1..10000};do char="seq -s "aaa" 100";echo ${#char} &>/dev/null;done
real 0m0.632s
user 0m0.448s
sys 0m0.180s
#wc
[abc@centos ~]$ time for n in {1..10000};do char="seq -s "aaa" 100";echo ${char}|wc -l &>/dev/null;done
real 1m13.514s
user 0m21.037s
sys 1m32.785s
#expr
[abc@centos ~]$ time for n in {1..10000};do char="seq -s "aaa" 100";expr length "${char}" &>/dev/null;done
real 1m1.793s
user 0m7.315s
sys 0m59.825s
#awk
[abc@centos ~]$ time for n in {1..10000};do char="seq -s "aaa" 100";echo ${char} | awk '{print length($0)}' &>/dev/null;done
real 1m10.577s
user 0m20.375s
sys 1m25.084s
可以看出通过"#"统计字符串长度用时最少,减少脚本的运行时间要减少管道符和外部命令的使用
实例
批量修改文件名
先批量创建文件,实现批量修改文件名功能
#批量创建文件
[abc@centos ~]$ mkdir sub_str/
[abc@centos ~]$ cd sub_str/
[abc@centos sub_str]$ touch test_{1..5}_finished.jpg
[abc@centos sub_str]$ ll
总用量 0
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_1_finished.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_2_finished.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_3_finished.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_4_finished.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_5_finished.jpg
#1.通过mv命令修改单个文件名
[abc@centos sub_str]$ mv test_1_finished.jpg test_1.jpg
[abc@centos sub_str]$ ll
总用量 0
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_1.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_2_finished.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_3_finished.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_4_finished.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_5_finished.jpg
#2.使用变量来去掉"_finished"
[abc@centos sub_str]$ f=test_1_finished.jpg
[abc@centos sub_str]$ echo $f
test_1_finished.jpg
[abc@centos sub_str]$ echo ${f//_finished/}
test_1.jpg
#3.使用反引号``
[abc@centos sub_str]$ mv `echo ${f}` `echo ${f//_finished/}`
[abc@centos sub_str]$ ll
总用量 0
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_1.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_2_finished.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_3_finished.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_4_finished.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_5_finished.jpg
#4.多次执行
#匹配有"_finished"字符的jpg文件
[abc@centos sub_str]$ ls *fin*.jpg
test_2_finished.jpg test_4_finished.jpg
test_3_finished.jpg test_5_finished.jpg
#for循环输出有"_finished"的文件名
[abc@centos sub_str]$ for file_name in `ls *fin*.jpg`;do echo ${file_name};done
test_2_finished.jpg
test_3_finished.jpg
test_4_finished.jpg
test_5_finished.jpg
#将"2.使用变量来去掉"_finished""和for循环组合起来使用
[abc@centos sub_str]$ for file_name in `ls *fin*.jpg`;do mv ${file_name} ${file_name//_finished/};done
[abc@centos sub_str]$ ll
总用量 0
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_1.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_2.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_3.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_4.jpg
-rw-rw-r--. 1 abc abc 0 9月 3 18:59 test_5.jpg