linux shell字符串截取的详细总结(实用!)

摘自:https://www.jb51.net/article/257063.htm

 更新时间:2022年07月27日 15:55:23   作者:悟空悟道  
 
在开发的时候经常会自行写一些小的脚本,其中就用到截取字符串的操作,这篇文章主要给大家介绍了关于linux shell字符串截取的详细方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
 

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

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

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
posted @ 2022-11-11 16:15  LiuYanYGZ  阅读(4728)  评论(0编辑  收藏  举报