一、字符串变量的截取操作

对字符串变量的截取操作一般都是通过${操作符}的方式进行,如下:

1. 从指定位置(index)截取固定长度

格式:${string:start:length}

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

例如:

str_time='2022-09-01 12:30:58'
date_no=${str_time:0:10}			# 截取前面10位字符:2022-09-01
date_mon=${str_time:5:2}			# 从前面第6位开始截取2位字符:09
date_time=${str_time:0-8}			# 截取后面8位字符:12:30:58
date_hh=${str_time:0-8:2}			# 截取后面8位字符的前面两位:12

2. 截取指定字符串(子字符串)左边的字符

格式1:${string%substr*} #匹配从右往左第一个substr

格式2:${string%%substr*} #匹配从右往左最后一个substr

说明:上面%的运算实际上可以理解为,删除substr以及substr右边的任意字符串,*号在substr右边,从而得到substr左边剩余字符串。 格式1和格式2的区别是匹配substr的位置

例如:

v_str='/app/logs/202204111015.log'
echo ${v_str%/*}			# 截取从右往左第一个'/' 左边的字符:/app/logs
echo ${v_str%%/*}			# 截取从右往左最后个'/' 左边的字符:空

3.截取指定字符串(子字符串)右边的字符

格式1:${string#*substr} #匹配从左往右第一个substr

格式2:${string##*substr} #匹配从左往右最后一个substr

说明:上面#的运算实际上可以理解为,删除substr以及substr左边的任意字符串,*号在substr的左边,从而得到substr右边剩余字符串。 格式1和格式2的区别是匹配substr的位置

例如:

v_str='/app/logs/202204111015.log'
echo ${v_str#*/}			#截取从左往右第一个'/' 右边的字符:app/logs/133.38.112.177_202204111015.log
echo ${v_str##*/}			#截取从左往右最后个'/' 右边的字符:133.38.112.177_202204111015.log

注意:用%#截取字符串的用法,比较容易忘记容易混淆。

有个小技巧加以区别:

键盘上#号在$符号的左边,所以是操作并删除左边字符,所以*substr的左边,一个#号代表取第一个substr(从左往右):${string#*substr}

键盘上%号在$符号的右边,所以是操作并删除右边字符,所以*substr的右边,一个%代表取第一个substr(从右往左):${string%substr*}

二、用cut命令截取(适合处理管道流或行文本字符)

格式:cut OPTION... [FILE]

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b-c-f 标志之一。

OPTION:

-b :以字节为单位选取指定的字节数
-c :以字符为单位选取指定的字符数
-d :指定分隔符(默认是tab)将字符串分为多个区域,一般与-f参数一起使用
-f :与-d一起使用,指定选取哪个区域
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除
用法:

例如:处理test.txt文件,截取每一行的指定字符

## 原始文件
cat test.txt
a_202204110214_1.2.3.5
b_202204110215_1.2.3.6
b_202204110216_1.2.3.7
c_202204110217_1.2.3.8


## -b 选项:
# 截取1,3字节
cut -b 1,3 test.txt
a2
b2
b2
c2

#截取1到3字节
cut -b 1-3 test.txt 
a_2
b_2
b_2
c_2


## -c选项:  
# 截取1,3字符
cut -c 1,3 test.txt
a2
b2
b2
c2
 
# 截取1到3字符
cut -c 1-3 test.txt 
a_2
b_2
b_2
c_2


## -d -f选项:
# 以下划线分割,取第三个区域字符
cut -d '_' -f3 test.txt 
1.2.3.5
1.2.3.6
1.2.3.7
1.2.3.8
# 结合管道使用效果一样
cat test.txt | cut -d'_' -f3

(完)