linux shell字符串截取的详细总结(实用!)
摘自:https://www.jb51.net/article/257063.htm
一、字符串变量的截取操作
对字符串变量的截取操作一般都是通过${操作符}的方式进行,如下:
1.从指定位置(index)截取固定长度
格式:${string:start:length}
其中,string 是要截取的字符串,start 是起始位置(下标从 0 开始计数),length 是要截取的长度(省略的话表示直到字符串的末尾)
例如:
1
2
3
4
5
|
str_time= '2022-02-01 12:30:58' date_no=${str_time:0:10} #截取前面10位字符:2022-01-01 date_mon=${str_time:5:2} #从前面第6位开始截取2位字符:02 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的位置
例如:
1
2
3
|
v_str= '/app/logs/133.38.112.177_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的位置
例如:
1
2
3
4
5
|
v_str= '/app/logs/133.38.112.177_202204111015.log' #截取从左往右第一个'/' 右边的字符:app/logs/133.38.112.177_202204111015.log echo ${v_str #*/} #截取从左往右最后个'/' 右边的字符:133.38.112.177_202204111015.log echo ${v_str ##*/} |
注意:用%和#截取字符串的用法,比较容易忘记容易混淆。
有个小技巧加以区别:
键盘上#号在$符号的左边,所以是操作并删除左边字符,所以*在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文件,截取每一行的指定字符
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
|
$ cat test .txt a_202204110214_10.251.82.225 b_202204110215_10.251.82.223 b_202204110212_10.251.82.226 c_202204110214_10.251.82.228 -b选项: $ cut -b 1,3 test .txt #截取1,3字节 a2 b2 b2 c2 $ cut -b 1-3 test .txt #截取1到3字节 a_2 b_2 b_2 c_2 -c选项: $ cut -c 1,3 test .txt #截取1,3字符 a2 b2 b2 c2 $ cut -c 1-3 test .txt #截取1到3字符 a_2 b_2 b_2 c_2 -d -f选项: $ cut -d '_' -f3 test .txt #以下划线分割,取第三个区域字符 10.251.82.225 10.251.82.223 10.251.82.226 10.251.82.228 $ cat test .txt | cut -d '_' -f3 #结合管道使用效果一样 |
补充:使用%和%%:截取的是指定字符前边内容
1
2
3
4
5
6
7
8
9
|
val=“hello++world++shell” echo ${val%++*} # 删除最后一个 ++ 后边字符,截取前边剩下的内容 # 输出: hello++world echo ${val%%++*} # 删除第一个 ++ 后边字符,只截取保留第一个 ++ 前边的内容 # 输出: hello |
示例 截取文件名字,去掉后缀
1
2
3
4
5
|
str_file= "123.hello.json" echo ${str_file%.*} # 删除最后一个 . 后边的json,截取123.hello # 输出: 123.hello |