Shell 字符串截取总结
一、字符串变量的截取操作
对字符串变量的截取操作一般都是通过${操作符}
的方式进行,如下:
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
(完)
- 作者:xmlwch
- 原文链接:https://m730.xmlwch.cn/2022/09/13/chlinux/shell-substr.html
- 版权声明:本作品采用 知识共享 署名-相同方式共享 4.0 国际(CC BY-SA 4.0)许可协议 进行许可,转载无需与我联系,但请注明出处。