专题 (六)字符串相关操作

1、字符串分割

(1) 用 # 操作符分割

用途是从左边开始删除第一次出现子字符串即其左边字符,保留右边字符。用法为 #*substr ,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str#*//}
得到的结果为www.你的域名.com/cut-string.html,即删除从左边开始到第一个"//"及其左边所有字符2、使用 ## 号操作符。用途是从左边开始删除最后一次出现子字符串即其左边字符,保留右边字符

(2) 用 ## 操作符分割

用法为 ##*substr,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str##*/}
得到的结果为cut-string.html,即删除最后出现的"/"及其左边所有字符

(3) 用 % 操作符分割

用途是从右边开始删除第一次出现子字符串即其右边字符,保留左边字符。用法为 %substr* ,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str%/*}
得到的结果为http://www.你的域名.com,即删除从右边开始到第一个"/"及其右边所有字符

(4) 用 %% 操作符分割

用途是从右边开始删除最后一次出现子字符串即其右边字符,保留左边字符。用法为 %%substr* ,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str%%/*}
得到的结果为 http://www.你的域名.com,即删除从右边开始到最后一个 "/" 及其右边所有字符

(5) 数字分割

a) 从左边第几个字符开始以及字符的个数,用法为 :start:len ,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。 左边第一个字符下标为 0
结果是:http:

b) 从左边第几个字符开始一直到结束,用法为 :start,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${var:7}
其中的 7 表示左边第8个字符开始
结果是:www.你的域名.com/cut-string.html

c) 从右边第几个字符开始以及字符的个数,用法:0-start:len,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str:0-15:10}
其中的 0-15 表示右边算起第15个字符开始,10 表示字符的个数。 右边第一个字符下标为 1,表示为 0-1
结果是:cut-string

d) 从右边第几个字符开始一直到结束,用法:0-start,例如:
str='http://www.你的域名.com/cut-string.html'
echo ${str:0-4}
其中的 0-4 表示右边算起第4个字符开始 一直到右边结束。
结果是:html

(6) 字符串匹配

a) 判断某个字符串是否以某个字符或字串开头

方法一:使用 == 比较

[[ $str == h* ]]

有两个地方需要注意:

  1. h*不需要使用引号括起来,使用引号括起来是直接做相等比较
  2. 比较语句使用双中括号括起来,而不是使用单中括号

方法二:使用 =~正则比较

 [[ "$str" =~ ^he.* ]]

使用正则匹配字符串的开头字符需要注意:

  • he*:不要使用he*,这里的*号表示e字符0到多个,即h,以及heeee都是测试通过的
  • he.*:这里只允许包含he的字符串通过测试
  • ^he.*:这个表示是以he开头的字符串通过检测

注意: =~ 前后要有一个空格,否则执行结果是错误的

b) 判断某个字符串不是以某个字符或字符串开头

 [[ ! "$str" =~ ^he.* ]]

2、config文件中k-v操作

(1) 获取config文件中指定k的v

IP_NODE_1=`awk -F= -v k=$IP_NODE_1_KEY '{ if ( $1 == k ) print $2; }' "$CONFIG_FILE" | sed 's/\r//'`     #IP_NODE_1_KEY 为key ,CONFIG_FILE为config文件绝对地址
IP_NODE_2=`awk -F= -v k=$IP_NODE_2_KEY '{ if ( $1 == k ) print $2; }' "$CONFIG_FILE" | sed 's/\r//'`

#这个方法使用范围更管,在 database.1.target.pwd=EQAQAC8Yk+EiZ6F8WcatBWyqy+6QssMnZM/NZ4HteNe/0QPPnP1tBnDLdbYW0AKCkYX10w== 这种value中含有 = 号的情况下也是适用的
value=`awk -v ri="^$key=" -F "^$key=" '$0~ri{print $2}' $2` #$1 这个是key

 (2) 遍历文件读取k-v

 while read line;do
   #过滤注释
     if [ `grep -e '^\s*#' $line |wc -l` -ne 0 ];then
       continue
     fi
     if [[ "$line"!=~^database.* ]];then
        continue
     fi
     _k=`echo $line |awk -F= '{print $1}'`
     _v=`echo $line |awk -F= '{print $2}'`
    echo $_k
    echo $_v
   done < $config_file

 

3、判断字符串是否为数字

(1) 判断字符串是否为整型数字

a) 使用awk判断

# 使用awk函数判断是否为数字
is_number() {
    local result=$(awk -v num="$1" 'BEGIN {print (num == num+0)}')
    if [[ $result -eq 1 ]]; then
       return 0
    else
       return 1
    fi
}
is_number "1234" # 是数字
is_number "abcd" # 不是数字
is_number "12.34" # 不是数字

b) 使用正则表达式判断

is_number() {
    if [[ $1 =~ ^[0-9]+$ ]]; then
        echo "是数字"
    else
        echo "不是数字"
    fi
}
 
is_number "1234"     # 是数字
is_number "abcd"     # 不是数字
is_number "12.34"    # 不是数字

 

 

4、其它

(1) 获取字符串长度

${#string_name}

 

案例:

1、使用 grep/sed 提取 json字符串中指定key的value值

可以具体见:https://blog.csdn.net/kakabuqinuo/article/details/99845797

2、判断字符串是否包含特定子字符串

(1) 使用 grep (这种是非常常见的)

s1="abcdefg"
s2="bcd"
result=$(echo $s1 | grep "${s2}")
if [[ "$result" != "" ]]
then
    echo "$s1 include $s2"
else
    echo "$1 not include $s2"
fi

(2) 使用操作符~

fileName=/home/sss/data/hk

if [[ $fileName =~hk ]]
then
    echo "$fileName include hk"
else
    echo "not include"
fi

(3) 使用通配符*

A="helloworld"
B="low"
if [[ $A == *$B* ]]
then
    echo "包含"
else
    echo "不包含"
fi

3、判断字符是否以某个字符串开头

(1) 使用 == 判断

str="hello"
if [[ $str == h* ]];
then
 echo 'yes'
fi

(2) 使用 =~ 判断

str="hello"
if [[ "$str" =~ ^he.* ]]; then
    echo "yes"
fi

4、截取父目录中的某个字母之后的内容

cd ${current_path}
wrapper=`pwd`
indexNo=${wrapper##*.}     #父目录格式为 test.1   通过该段代码最终会获取 1 
cd ${current_path}

 5、其它

(1) 产生随机字符串

方法一

head -c 10 /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 10

命令如上图所示,但有时候会输出 ”You have new mail in ....“ 等不要的内容,此时可将该命令修改成

head -c 10 /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 10 |awk '{print $1}'

 方法二

将生成一个只包含小写字母的随机字符串,长度为10

awk 'BEGIN{srand();for(i=0;i<10;i++) printf "%c",int(rand()*26)+97}'

 

 

参考:

https://www.cnblogs.com/sssblog/p/10273148.html

https://www.cnblogs.com/aslongas/p/5993690.html

shell支持正则:Linux shell判断字符串是否以某些字符开头 - LiuYanYGZ - 博客园 (cnblogs.com)

posted @ 2021-05-13 11:56  夏之夜  阅读(91)  评论(0)    收藏  举报