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

目录
  • 一、字符串变量的截取操作
    • 1.从指定位置(index)截取固定长度
    • 2.截取指定字符串(子字符串)左边的字符
    • 3.截取指定字符串(子字符串)右边的字符
  • 二、用cut命令截取(适合处理管道流或行文本字符)
  • 补充:使用%和%%:截取的是指定字符前边内容
  • 总结

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

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

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

格式:${string:start:length}

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

例如:

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的位置

例如:

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的位置

例如:

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文件,截取每一行的指定字符

$ 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   #结合管道使用效果一样

补充:使用%和%%:截取的是指定字符前边内容

val=“hello++world++shell”

echo ${val%++*}
# 删除最后一个 ++ 后边字符,截取前边剩下的内容
# 输出: hello++world

echo ${val%%++*}
# 删除第一个 ++ 后边字符,只截取保留第一个 ++ 前边的内容
# 输出: hello 

示例 截取文件名字,去掉后缀

str_file="123.hello.json"

echo ${str_file%.*}
# 删除最后一个 . 后边的json,截取123.hello
# 输出: 123.hello

总结

到此这篇关于linux shell字符串截取的文章就介绍到这了,更多相关linux shell字符串截取内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • shell编程中的字符串截取方法小结

    一.Gnu Linux shell 截取字符变量的前8位,有方法如下: 1.expr substr "$a" 1 8 2.echo $a|awk '{print substr(,1,8)}' 3.echo $a|cut -c1-8 4.echo $ 5.expr $a : '\(.\\).*' 6.echo $a|dd bs=1 count=8 2>/dev/null   二.按指定的字符串截取 1.第一种方法: ${varible##*string} 从左向右截取最后一个str

  • Shell脚本8种字符串截取方法总结

    Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. 复制代码 代码如下: echo ${var#*//} 其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符 即删除 http:// 结果是 :www.aaa.com/123.htm 2. ## 号截取,删除左边字符,保留右边字符. 复制代码 代码如下: echo ${var##*/}

  • Shell字符串截取的实现方法(非常详细)

    Shell 截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取. 从指定位置开始截取 这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串. 既然需要指定起始位置,那么就涉及到计数方向的问题,到底是从字符串左边开始计数,还是从字符串右边开始计数.答案是 Shell 同时支持两种计数方式. 1) 从字符串左边开始计数 如果想从字符串的左边开始计数,那么截取字符串的具体格式如下: ${string: start :length} 其中,stri

  • Shell字符串截取的详细方法

    一.Linux shell 截取字符变量的前8位,有方法如下: 复制代码 代码如下: 1.expr substr "$a" 1 82.echo $a|awk '{print substr(,1,8)}'3.echo $a|cut -c1-84.echo $5.expr $a : '\(.\\).*'6.echo $a|dd bs=1 count=8 2>/dev/null 二.按指定的字符串截取1.第一种方法:${varible##*string} 从左向右截取最后一个strin

  • shell字符串截取报错:Bad substitution的解决

    问题重现: 当前系统Ubuntu16 shell进行字符串截取 运行 ${GIT_COMMIT:0:6}报错: /tmp/jenkins7505855461406722507.sh: 4: /tmp/jenkins7505855461406722507.sh: Bad substitution 原因:两种shell语言解释器 bash和dash 查看当前/bin/sh 指向哪种解释器: ls /bin/sh -al lrwxrwxrwx 1 root root 4 Mar 26 2018 /bi

  • Linux Shell 截取字符串的方法示例

    shell中截取字符串的方法很多 ${var#*/} ${var##*/} ${var%/*} ${var%%/*} ${var:start:len} ${var:start} ${var:0-start:len} ${var:0-start} 格式 说明 ${string: start :length} 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符. ${string: start} 从 string 字符串的左边第 start 个字符开始截取,直到

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

    目录 一.字符串变量的截取操作 1.从指定位置(index)截取固定长度 2.截取指定字符串(子字符串)左边的字符 3.截取指定字符串(子字符串)右边的字符 二.用cut命令截取(适合处理管道流或行文本字符) 补充:使用%和%%:截取的是指定字符前边内容 总结 一.字符串变量的截取操作 对字符串变量的截取操作一般都是通过${操作符}的方式进行,如下: 1.从指定位置(index)截取固定长度 格式:${string:start:length} 其中,string 是要截取的字符串,start 是

  • Linux shell脚本基础学习详细介绍(完整版)第1/2页

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Linux 脚本编写基础 ◆1.1 语法基本介绍1.1.1 开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序.当编辑好脚本时,如果要执行该脚本,还必须使其可执行.要使脚本可执行:编译

  • linux shell 字符串操作(长度,查找,替换)详解

    在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那

  • linux shell字符串内置的常用操作(获取长度、查找、替换)

    之前我们也发过相关的文章.这里呢,推荐大家使用一些内置的函数. 在编写shell程序时,经常会涉及到字符串相关操作.有许多命令语句,如awk,sed都能够做字符串各种操作. 事实上shell内置一系列操作符号,能够达到相似效果,使用内部操作符会省略启动外部程序等时间,因此速度会很的快.如果内置的操作符能够做到的,优先使用内置的. 1 读取字符串值 表达式 含义 ${var} 变量var本来的值 ${var-default} var没声明返回default,但不改变var的值 ${var:-def

  • linux shell 路径截取正则表达式

    最近写脚本,需要对脚本中函数传递的路径参数进行截取,发现了以下比较好用的方法,记录下: file=/dir1/dir2/dir3/my.file.txt 我们可以用${ }分别替换获得不同的值: ${file#*/}:拿掉第一条/及其左边的字串:dir1/dir2/dir3/my.file.txt ${file##*/}:拿掉最后一条/及其左边的字串:my.file.txt ${file#*.}:拿掉第一个.及其左边的字串:file.txt ${file##*.}:拿掉最后一个.及其左边的字串:

  • linux shell 逻辑运算符、逻辑表达式详细介绍

    一.逻辑运算符 逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测『档案』是否存在 eg: if [ -f filename ] -d 常用!侦测『目录』是否存在 -b 侦测是否为一个『 block 档案』 -c 侦测是否为一个『 character 档案』 -S 侦测是否为一个『 socket 标签档案』 -L 侦测是否为一个『 symbolic link 的档案』 -e 侦测『某个东西』是否存在! 2. 关于程序的逻辑卷标! -G 侦测是否由 GID 所执行的程序所拥

  • Linux Shell中curl和wget使用代理IP的方法教程

    前言 大家都知道,在Linux Shell中提供两个非常实用的命令来爬取网页,它们分别是 curl 和 wget,本文将给大家详细介绍关于在Linux Shell中curl和wget使用代理IP的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看吧. curl 和 wget 使用代理 curl 支持 http.https.socks4.socks5 wget 支持 http.https 代理示例: #!/bin/bash # # curl 支持 http.https.socks4.so

随机推荐