shell脚本提取字符串的几种方式
1、使用grep+sed+awk,查找编辑和输出。
例子:取得droped字段的值
原始输出
# show capture [0 pflow]: Interface:zc:1@1(12580) 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 |
${string: start} | 从 string 字符串的左边第 start 个字符开始截取,直到最后。 |
[root]# echo ${var:5} |
${string: 0-start :length} | 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。 |
[root]# echo ${var:0-5:3} |
${string: 0-start} | 从 string 字符串的右边第 start 个字符开始截取,直到最后。 |
[root]# echo ${var:0-5} |
${string#*chars} | 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。 |
[root]# echo ${var#*l} |
${string##*chars} | 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。 |
[root]# echo ${var##*l} |
${string%chars*} | 从 string 字符串第一次出现 chars* 的位置开始,截取 chars* 左边的所有字符。 |
[root]# echo ${var%l*} |
${string%%chars*} | 从 string 字符串最后一次出现 chars* 的位置开始,截取 chars* 左边的所有字符。 |
[root]# echo ${var%%l*} |
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