Linux 使用shell脚本处理字符串的实现

1. 截取字符串的前8位

expr substr "$string" 1 8
echo $string | awk '{print substr(,1,8)}'
echo $string | cut -c1-8
echo $string | dd bs=1 count=8 2>/dev/null

2. 分割、替换字符串

2.1 命令说明

符号 释义
* 通配符,用于匹配字符串将被删除的子串
. 分割符,可以为任意一个或多个字符
% 从右向左匹配
# 从左向右匹配
/ 表示替换
% # / 非贪婪匹配,即匹配符合通配符的最短结果
% ## // 贪婪匹配,即匹配符合通配符的最长结果
示例 含义
${#VALUE} 计算VALUE字符串的字符数量
${VALUE%.*} 或 ${VALUE%%.*} 删除VALUE字符串中以分隔符"."匹配的右侧字符,保留左侧字符
${VALUE#*.} 或 ${VALUE##*.} 删除VALUE字符串中以分隔符"."匹配的左侧字符,保留右侧字符
${VALUE/OLD/NEW} 或 ${VALUE//OLD/NEW} 用NEW子串替换VALUE字符串中匹配的OLD子串

2.2 应用实例

定义变量name=odysee_odysee

计算VALUE字符串的字符数量

echo ${#name}  # 输出结果 13

删除VALUE字符串中以分隔符"."匹配的右侧字符,保留左侧字符

# 非贪婪匹配
echo ${name%y*}  # 输出结果 odysee_od
# 贪婪匹配
echo ${name%%y*} # 输出结果 od

删除VALUE字符串中以分隔符"."匹配的左侧字符,保留右侧字符

# 非贪婪匹配
echo ${name#*y}  # 输出结果 see_odysee
# 贪婪匹配
echo ${name##*y} # 输出结果 see

用NEW子串替换VALUE字符串中匹配的OLD子串

# 非贪婪匹配
echo ${name/o/O} #输出结果 Odysee_odysee

# 贪婪匹配
echo ${name//o/O} #输出结果 Odysee_Odysee

3. 字符串截取

3.1 命令说明

示例 含义
${VALUE:POSITION} 在字符串VALUE中,从位置POSITION开始提取子串(从左到右匹配)
${VALUE:POSITION:LENGTH} 在字符串VALUE中,从位置POSITION开始提取长度为LENGTH的子串(从左到右匹配)
${VALUE:0-OFFSET} 在字符串VALUE中,从右到左截取OFFSET个字符
${VALUE:0-OFFSET:LENGTH} 在字符串VALUE中,从右到左截取OFFSET个字符的前LENGTH个

3.2 应用实例

定义变量name=mynameisodysee

在字符串name中,从位置2开始提取子串(从左到右匹配)

echo ${name:2} # 输出结果 nameisodysee

在字符串name中,从位置2开始提取长度为4的子串(从左到右匹配)

echo ${name:2:4} # 输出结果 name

在字符串name中,从右到左截取8个字符

echo ${name:0-8} # 输出结果 isodysee

在字符串name中,从右到左截取8个字符的前两个

echo ${name:0-8:2} # 输出结果 is

定义变量string=abc12342341 ,以下为截取示例

echo ${string:4}    # 从第4位开始截取后面所有字符串,输出结果:2342341
echo ${string:3:3}   # 从第3位开始截取后面3位,输出结果:123
echo ${string:3:6}   #从第3位开始截取后面6位,输出结果:123423
echo ${string: -4}   #截取后4位,输出结果:2341
echo ${string:(-4)}   #同上
expr substr $string 3 3 #从第3位开始截取后面3位,输出结果123

定义变量str="abcdef",以下为截取示例

expr substr "$str" 1 3 # 从第一个位置开始取3个字符,输出结果:abc
expr substr "$str" 2 5 # 从第二个位置开始取5个字符,输出结果:bcdef
expr substr "$str" 4 5 # 从第四个位置开始取5个字符,输出结果:def
echo ${str:2}      # 从第二个位置开始提取字符串,输出结果:bcdef
echo ${str:2:3}     # 从第二个位置开始提取3个字符,输出结果:bcd
echo ${str:(-6):5}   # 从倒数第二个位置向左提取字符串,输出结果:abcde
echo ${str:(-4):3}   # 从倒数第二个位置向左提取6个字符,输出结果:cde

4. 判断变量的值

4.1 命令说明

示例 含义
${string-DEFAULT} 如果string变量未定义,返回值为DEFAULT的值,否则返回变量的值
${string:-DEFAULT} 如果string变量未定义,或者其值为空,返回值为DEFAULT的值,否则返回变量的值
${string=DEFAULT} 如果string变量未定义,返回值为DEFAULT的值,并将DEFAULT赋值给string,否则返回变量的值
${string:=DEFAULT} 如果string变量未定义,或者其值为空,返回值为DEFAULT的值,
并将DEFAULT赋值给string,否则返回变量的值
${string+DEFAULT} 如果string已赋值,其值用DEFAULT替换,否则不进行任何替换
${string:+DEFAULT} 如果string已赋值,其值用DEFAULT替换,否则不进行任何替换
${string?ERR_MSG} 当变量未被定义时,将ERR_MSG消息发送到标准错误输出
${string:?ERR_MSG} 当变量未被赋值时,将ERR_MSG消息发送到标准错误输出

4.2 应用实例

${string-DEFAULT}:如果string变量未定义,返回值为DEFAULT的值,否则返回变量的值

# 未定义string变量
echo ${string-string 变量未定义}  # 输出结果:string 变量未定义

# 定义string变量,但值为空(会返回空值)
string=
echo ${string-string 变量未定义}  # 输出结果为空

# 定义string变量并赋值
string=test
echo ${string-string 变量未定义}  # 输出结果:test

${string:-DEFAULT}:如果string变量未定义,或者其值为空,返回值为DEFAULT的值,否则返回变量的值

# 未定义string变量
echo ${string:-string 变量未定义} # 输出结果:string 变量未定义

# 定义string变量,但值为空
string=
echo ${string:-string 变量值为空} # 输出结果:string 变量值为空

# 定义string变量并赋值
string=test
echo ${string:-string 变量值为空} # 输出结果:test

${string=DEFAULT}:如果string变量未定义,返回值为DEFAULT的值,并将DEFAULT赋值给string,否则返回变量的值

# 未定义string变量
echo ${string=123}  # 输出结果:123
echo ${string}  # 输出结果:123

# 定义string变量,但值为空(会返回空值)
string=
echo ${string=123}  # 输出结果为空
echo ${string}

# 定义string变量并赋值
string=test
echo ${string=123}  # 输出结果:test
echo ${string}  # 输出结果:test

${string:=DEFAULT}:如果string变量未定义,或者其值为空,返回值为DEFAULT的值,并将DEFAULT赋值给string,否则返回变量的值

# 未定义string变量
echo ${string:=123}  # 输出结果:123
echo ${string}  # 输出结果:123

# 定义string变量,但值为空
string=
echo ${string:=123}  # 输出结果:123
echo ${string}  # 输出结果:123

#定义string变量并赋值
string=test
echo ${string:=123}  # 输出结果:test
echo ${string}  # 输出结果:test

${string+DEFAULT}:如果string已赋值,其值用DEFAULT替换,否则不进行任何替换

# 未定义string变量
echo ${string+123}  # 输出结果为空
echo ${string}  # 输出结果为空

# 定义string变量,但值为空
string=
echo ${string+123}  # 输出结果:123
echo ${string}  # 输出结果为空

# 定义string变量并赋值
string=test
echo ${string+123}  # 输出结果:123
echo ${string}  # 输出结果:test

${string:+DEFAULT}:如果string已赋值,其值用DEFAULT替换,否则不进行任何替换

# 未定义string变量
echo ${string:+123}  # 输出结果为空
echo ${string}  # 输出结果为空

# 定义string变量,但值为空
string=
echo ${string:+123}  # 输出结果为空
echo ${string}  # 输出结果为空

# 定义string变量并赋值
string=test
echo ${string:+123}  # 输出结果:123
echo ${string}  # 输出结果:test

${string?ERR_MSG}:当变量未被定义时,将ERR_MSG消息发送到标准错误输出

# 未定义string变量
echo ${string?输出错误信息} # 输出结果:-bash: string: 输出错误信息
echo ${string}  # 输出结果为空

# 定义string变量,但值为空
string=
echo ${string?输出错误信息} # 输出结果为空
echo ${string}  # 输出结果为空

# 定义string变量并赋值
string=test
echo ${string?输出错误信息} # 输出结果:test
echo ${string}  # 输出结果:test

${string:?ERR_MSG}:当变量未被赋值时,将ERR_MSG消息发送到标准错误输出

# 未定义string变量
echo ${string:?输出错误信息} # 输出结果:-bash: string: 输出错误信息
echo ${string}  # 输出结果为空

# 定义string变量,但值为空
string=
echo ${string:?输出错误信息} # 输出结果:-bash: string: 输出错误信息
echo ${string}  # 输出结果为空

# 定义string变量并赋值
string=test
echo ${string:?输出错误信息} # 输出结果:test
echo ${string}  # 输出结果:test

5. 获取字符串长度

# 定义变量string=abc12342341
echo ${#string}  # 输出结果 11
expr length $string # 输出结果 11
expr "$string" : ".*" # 分号二边要有空格,这里的:根match的用法差不多

6. 获取字符串所在位置

# 定义变量str="abc"
expr index $str "a" # 输出结果 1
expr index $str "b" # 输出结果 2
expr index $str "x" # 输出结果 0
expr index $str ""  # 输出结果 0  

7. 获取从字符串开头到子串的最大长度

# 定义变量string=abc12342341
expr match $string 'abc.*3' # 输出结果 9

8. 显示匹配的内容

# 定义变量string=abc12342341
expr match $string '\([a-c]*[0-9]*\)' # 输出结果 abc12342341
expr $string : '\([a-c]*[0-9]\)'    # 输出结果 abc1
expr $string : '.*\([0-9][0-9][0-9]\)' # 输出结果 341 显示括号中匹配的内容

9. 显示不匹配的内容

# 定义变量string=abc12342341
echo ${string#a*3}   # 从$string左边开始,去掉最短匹配子串,输出结果:42341
echo ${string#c*3}   # 这样什么也没有匹配到,输出结果:abc12342341
echo ${string#*c1*3}  # 从$string左边开始,去掉最短匹配子串,输出结果:42341
echo ${string##a*3}  # 从$string左边开始,去掉最长匹配子串,输出结果:41
echo ${string%3*1}   # 从$string右边开始,去掉最短匹配子串,输出结果:abc12342
echo ${string%%3*1}  # 从$string右边开始,去掉最长匹配子串,输出结果:abc12

# 定义变量str="abbc,def,ghi,abcjkl"
echo ${str#a*c}     # 输出结果:def,ghi,abcjkl 一个井号(#) 表示从左边截取掉最短的匹配 (这里把abbc字串去掉)
echo ${str##a*c}    # 输出结果:jkl       两个井号(##) 表示从左边截取掉最长的匹配 (这里把abbc,def,ghi,abc字串去掉)
echo ${str#"a*c"}    # 输出结果:abbc,def,ghi,abcjkl  因为str中没有"a*c"子串
echo ${str##"a*c"}   # 输出结果:abbc,def,ghi,abcjkl  同理
echo ${str#*a*c*}    # 输出结果:空
echo ${str##*a*c*}   # 输出结果:空
echo ${str#d*f}     # 输出结果:abbc,def,ghi,abcjkl,
echo ${str#*d*f}    # 输出结果:ghi,abcjkl
echo ${str%a*l}     # 输出结果:abbc,def,ghi     一个百分号(%)表示从右边截取最短的匹配
echo ${str%%b*l}    # 输出结果:a           两个百分号表示(%%)表示从右边截取最长的匹配
echo ${str%a*c}     # 输出结果:abbc,def,ghi,abcjkl

# 这里要注意,必须从字符串的第一个字符开始,或者从最后一个开始,可以这样记忆, 井号(#)通常用于表示一个数字,它是放在前面的;百分号(%)卸载数字的后面; 或者这样记忆,在键盘布局中,井号(#)总是位于百分号(%)的左边(即前面)

10. 去掉字符串末尾的字符

使用df -Th获取磁盘信息,并将使用率赋给变量来与阈值进行对比,如果存在%号无法进行对比,所以需要去掉变量中的%号,可以使用${var%?}的格式来去掉最后一个字符

#!/bin/bash

root_usage=$(df -TPh | grep -w "/" | awk '{print $6}')
echo ${root_usage%?}

到此这篇关于Linux 使用shell脚本处理字符串的实现的文章就介绍到这了,更多相关shell处理字符串内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 比较两个字符串是否相等的shell代码

    比较两个字符串是否相等的办法是: if [ "$test"x = "test"x ]; then 这里的关键有几点: 1 使用单个等号 2 注意到等号两边各有一个空格:这是unix shell的要求 3 注意到"$test"x最后的x,这是特意安排的,因为当$test为空的时候,上面的表达式就变成了x = testx,显然是不相等的.而如果没有这个x,表达式就会报错:[: =: unary operator expected 二元比较操作符,比较

  • 在Shell中分割字符串的例子

    比如,要分割 test="aaa,bbb,cc cc,dd dd",可以这样 复制代码 代码如下: arr=$(echo $test|tr "," "\n") 还可以这样 复制代码 代码如下: OLD_IFS=$IFSIFS=','arr=$testIFS=$OLD_IFS 然后用 复制代码 代码如下: for x in $arr; do  echo $xdone 看看效果 或者更直接一点 复制代码 代码如下: IFS=',' arr=($tes

  • Shell获取字符串长度的多种方法总结

    前言 我们在日常工作中,对于求字符串操作在shell脚本中很常用,实现的方法有很多种,下面就来给大家归纳.汇总了求字符串的几种可能方法,话不多说了,来一起看看详细的介绍吧. 方法如下: [方法一]:利用${#str}来获取字符串的长度 [方法二]:利用awk的length方法 备注: 1) 最好用{}来放置变量 2) 也可以用length($0)来统计文件中每行的长度 [方法三]:利用awk的NF项来获取字符串长度 备注: -F为分隔符,NF为域的个数,即单行字符串的长度 [方法四]:利用wc的

  • Shell脚本实现简单分割字符串

    我们有这样一个字符串: 复制代码 代码如下: info='abcd;efgh' 现在想获取abcd和efgh,我们可以简单地用cut工具来获取: 复制代码 代码如下: fstr=`echo $info | cut -d \; -f 1` sstr=`echo $info | cut -d \; -f 2` 这里主要是用了cut工具的-d和-f参数: -d:指定字段的分隔符,默认的字段分隔符为"TAB": -f:显示指定字段的内容: 关于cut工具其他参数可参考这里:cut命令

  • Shell脚本中计算字符串长度的5种方法

    有时在Linux操作系统中需要计算某个字符串的长度,通过查询资料整理了下目前Shell中获取字符串的长度的多种方法,在这里分享给大家,方法如下: 方法1: 使用wc -L命令 wc -L可以获取到当前行的长度,因此对于单独行的字符串可以用这个简单的方法获取,另外wc -l则是获取当前字符串内容的行数. 复制代码 代码如下: echo "abc" |wc -L 方法2: expr length string 使用expr length可以获取string的长度 方法3: awk获取域的个

  • Shell中去除字符串前后空格的方法

    经常碰到的场景,需要去除字符串中的前后的空格.在Shell中不像其他语言有strip()来处理,不过也是可以使用诸如awk等命令来处理. 下面是一个简单示例: [root@localhost ~]# echo ' A B C ' | awk '{gsub(/^\s+|\s+$/, "");print}' ^\s+            匹配行首一个或多个空格 \s+$            匹配行末一个或多个空格 ^\s+|\s+$    同时匹配行首或者行末的空格 如果不用awk命令

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

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

  • Linux 使用shell脚本处理字符串的实现

    1. 截取字符串的前8位 expr substr "$string" 1 8 echo $string | awk '{print substr(,1,8)}' echo $string | cut -c1-8 echo $string | dd bs=1 count=8 2>/dev/null 2. 分割.替换字符串 2.1 命令说明 符号 释义 * 通配符,用于匹配字符串将被删除的子串 . 分割符,可以为任意一个或多个字符 % 从右向左匹配 # 从左向右匹配 / 表示替换 %

  • Linux通过Shell脚本命令修改密码的两种方式

    交互方式修改密码 1. ssh 远程到主机: 2. 切换到root账号: [一般都是切换到root进行密码修改,如果普通用户修改自己的密码,要输入原密码,然后新密码要满足复杂度才OK]: 3. passwd username 使用passwd username 修改 username 的密码: 使用该命令会有提示,即进入了交互界面,输入密码即可. 使用脚本修改密码 很多时候我们可能需要远程执行服务器上的脚本来修改账号密码,此时就没有办法进行交互了. 此时可以使用如下两种方式修改密码: 方式1:

  • Linux 在Shell脚本中使用函数实例详解

    Linux 在Shell脚本中使用函数实例详解 Shell的函数 Shell程序也支持函数.函数能完成一特定的功能,可以重复调用这个函数. 函数格式如下: 函数名() { 函数体 } 函数调用方式: 函数名 参数列表 实例:编写一函数add求两个数的和,这两个数用位置参数传入,最后输出结果. root@ubuntu:/home/study# vi test3 #!/bin/bash add(){ a=$1; b=$2; z=`expr $a + $b`; echo "The sum is $z&

  • 使用Linux的Shell脚本定时处理MySQL超时

    最近一段时间,我刚刚进入一家新公司,并接手了这里的一个站点,由于这个站点的架构设计不太合理,导致MySQL的压力始终很大,经常出现超时的Locked进程,于是编写了一段Linux的Shell脚本来定时kill掉这些进程.脚本如下: 复制代码 代码如下: #!/bin/bash mysql_pwd="xxxxxx" #mysql的root密码 mysql_exec="/usr/local/mysql/bin/mysql"tmp_dir="/tmp"

  • Linux Crontab Shell脚本实现秒级定时任务的方法

    一.编写Shell脚本crontab.sh #!/bin/bash step=1 #间隔的秒数,不能大于60 for (( i = 0; i < 60; i=(i+step) )); do $(php '/home/www/php/crontab/crontab.php') sleep $step done exit 0 二.crontab -e 输入以下语句,然后:wq 保存退出 # m h dom mon dow command * * * * * /home/www/php/crontab

  • Linux中shell脚本获取当前工作目录的方法

    如下: workdir=$(cd $(dirname $0); pwd) 步骤1 dirname $0,取得当前执行的脚本文件的父目录 步骤2 cd到父目录,即进入当前工作目录 步骤3 pwd显示当前工作目录 以上这篇Linux中shell脚本获取当前工作目录的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Linux下shell脚本监控Tomcat的状态并实现自动启动的步骤

    最近公司需要在Linux下监控tomcat的服务,一旦tomcat服务存在异常或者宕机,重启tomcat保证服务的正常运行,由于Linux下有Shell脚本可以实现此效果,下面是Linux下shell脚本监控Tomcat的状态并实现自动启动的步骤. 1.编写Shell脚本monitor.sh #!/bin/sh # func:自动监控tomcat脚本并且执行重启操作 # author:EagleHao # date:2018-04-08 # DEFINE # 获取tomcat进程ID(其中[gr

  • Linux 中shell脚本设置开头固定格式的实现方法

    Linux 之shell脚本设置开头固定格式 每次进入shell都要设置开头,很麻烦,现修改vim配置文件即可. [root@node01 ~]vim .vimrc 将下列内容复制进文件 set ignorecase set cursorline set autoindent autocmd BufNewFile *.sh exec ":call SetTitle()" func SetTitle() if expand("%:e") == 'sh' call se

  • linux下shell脚本备份文件的方法实现

    目录 1.shell自动备份 2.关于find命令: 1.shell自动备份 主要功能: 1)将pathSrc目录中的文件拷贝到pathDst目录中去. 具体步骤:先查询源目录和目标目录中的文件,分别存在fileSrc和fileDst中. -> 来两个循环,比较.不在fileDst的就拷贝过去.再判断一下是否拷贝成功. 2)将pathSrc中的文件保留180天. 具体步骤:先查出源目录中大于180天的文件(就是那句find),然后删除. #!/bin/bash v_time=`date "

  • shell脚本实现字符串的动态替换方法

    目录 背景 代码 使用示例 用shell实现某行字符串的替换 背景 我们有时候需要完成字符串的多组替换,比如需要完成以下替换 将“小草”替换为“真是让人印象深刻” 将“小狗的”替换为“可爱的” 将“你听清楚了吗”替换为“我说明白了吗” 将“我不会”替换为“我可以学” 将“打麻将”替换为“修长城” 将“打游戏”替换为“计算机实践练习” 在shell脚本中全部替换的方式为${var//old/new}.我们可以通过如下命令替换: var=${var//小草/真是让人印象深刻} var=${var//

随机推荐