原文链接:https://www.cnblogs.com/superbaby11/p/17007867.html
shell脚本提取字符串的几种方式
1、使用grep+sed+awk,查找编辑和输出。
例子:取得droped字段的值
原始输出
show capture
RX packets:29021 dropped:0
RX bit/sec:0.00(Mbps) pkt/sec:0.00(pps)
获取指定字段值
value=show capture
echo “$value” | grep “dropped” | sed ‘s/😕 /g’ | awk ‘{print $5}’
说明:使用grep找到字符串所在行,使用sed把冒号替换为空格,使用awk获取想要的字符串
2、使用sed正则表达式提取字符串
提取数字
[admin]# echo here365test666 | sed “s/.ere([0-9])test([0-9]*)/\1\ \2/g”
365 666
s表示替换,\1和\2分别表示用第一个括号和第二个括号里面的内容,空格需要转义。sed支持*,不支持?、+,不能用d之类,正则支持有限。
整个sed表达式的作用是:用提取出的数字替换原来的字符串。
3、字符串变量截取
这种方式需要把字符串存在一个变量中。
我们对以上 8 种格式做一个汇总,请看下表:
格式 说明 举例
${string: start :length} 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
[root]# var=HelloWorld
[root]# echo ${var:0:5}
Hello
${string: start} 从 string 字符串的左边第 start 个字符开始截取,直到最后。
[root]# echo ${var:5}
World
${string: 0-start :length} 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
[root]# echo ${var:0-5:3}
Wor
${string: 0-start} 从 string 字符串的右边第 start 个字符开始截取,直到最后。
[root]# echo ${var:0-5}
World
${string#*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
[root]# echo ${var#*l}
loWorld
${string##*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
[root]# echo ${var##*l}
d
${string%chars*} 从 string 字符串第一次出现 chars* 的位置开始,截取 chars* 左边的所有字符。
[root]# echo ${var%l*}
HelloWor
${string%%chars*} 从 string 字符串最后一次出现 chars* 的位置开始,截取 chars* 左边的所有字符。
[root]# echo ${var%%l*}
He
4、cut
与第3点对应,cut用来直接截取字符串,不需要把字符串存在变量中。
cut可以按照字符、字节、列截取数据。
原始文件
[root]# cat test.sh
abc 123 zz
dfg 457 yy
1)输出第2、3个字符
[root]# cat test.sh | cut -c2-3
bc
fg
2)与【awk】类似,输出指定列
[root@skyeye admin]# cat test.sh | cut -d " " -f2
123
457
5、tr
tr主要是替换字符串。
1)最常见的场景就是压缩空白格
[root]# echo ‘hello 123 world 456 !!!’ | tr -s ’ ’
hello 123 world 456 !!!
-s参数指定要压缩的内容为空格
2)与【sed】类似,替换和删除字符串
例如制表符替换为空格
复制代码
[root@skyeye admin]# cat test.sh
abc 123 zz
dfg 457 yy
[root@skyeye admin]# cat test.sh | tr “\t” " "
abc 123 zz
dfg 457 yy
复制代码
例如删除数字
复制代码
[root@skyeye admin]# cat test.sh
abc 123 zz
dfg 457 yy
[root@skyeye admin]# cat test.sh | tr -d “{0-9}”
abc zz
dfg yy