作为程序员一定要保持良好的睡眠,才能好编程

shell截取字符串方式(cut、awk、sed命令)字符串切割

发布时间:2019-12-13


在shell变量中切割字符串


shell中截取字符串的方法有很多中,

${expression}一共有9种使用方法。

${parameter:-word}

${parameter:=word}

${parameter:?word}

${parameter:+word}

上面4种可以用来进行缺省值的替换。

${#parameter}

上面这种可以获得字符串的长度。

${parameter%word} 最小限度从后面截取word

${parameter%%word} 最大限度从后面截取word

${parameter#word} 最小限度从前面截取word

${parameter##word} 最大限度从前面截取word

上面4个就是用来截取字符串的方法了。

有了着四种用法就不必使用cut命令来截取字符串了

第一种又可以分为四种情况,下面一一介绍。


1、使用 # 号操作符。用途是从左边开始删除第一次出现子字符串即其左边字符,保留右边字符。用法为#*substr,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${str#*//}

得到的结果为www.你的域名.com/cut-string.html,即删除从左边开始到第一个"//"及其左边所有字符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,即删除从右边开始到最后一个"/"及其右边所有字符


第二种也分为四种,分别介绍如下:

1、从左边第几个字符开始以及字符的个数,用法为:start:len,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。

结果是:http:

2、从左边第几个字符开始一直到结束,用法为:start,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${var:7}

其中的 7 表示左边第8个字符开始

结果是:www.你的域名.com/cut-string.html

3、从右边第几个字符开始以及字符的个数,用法:0-start:len,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${str:0-15:10}

其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。

结果是:cut-string

3、从右边第几个字符开始一直到结束,用法:0-start,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${str:0-4}

其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。

结果是:html

注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)






1.cut


-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。

-c :以字符为单位进行分割。


-d:自定义分隔符,默认为制表符。


-f:与-d一起使用,指定显示哪个区域。


-n:取消分割多字节字符。仅和-b标志一起使用。如果字符的最后一个字节落在由-b标志的List参数指示的范围之内,该字符将被写出;否则,该字符将被排除。


 


-b


.eg1:然后调用cut,即剪切字符串中的第2和第5个字节。


echo"123abc"|cut -b 2,5

先输出123abc


输出为2b


.eg2:cut掉11-14位置的字符


 echo "123456789abcdefghjklmnopq" | cut -b 11-14

输出为bcde




-c


用法示例输出/etc/passwd文件每一行的前4个字符$ sudo cut -c 1-4 /etc/passwd


      取完之后     


 


-d


 cut命令用于列提取,默认分隔符是tab键。


选项:-d指定分隔符,-f指定提取第几列


eg1: 以%作为分隔符 输出第一个%前的区域1的东西,输出区域2的东西       


复制代码

root@ROUTER:~# echo "CPU:  busy 14%  (system=10% user=3% nice=0% idle=85%)" | cut -d \% -f 1

CPU:  busy 14

root@ROUTER:~# echo "CPU:  busy 14%  (system=10% user=3% nice=0% idle=85%)" | cut -d \% -f 2

  (system=10

root@ROUTER:~# echo "CPU:  busy 14%  (system=10% user=3% nice=0% idle=85%)" | cut -b 11-14 | cut -d \% -f 1

 14

root@ROUTER:~# echo "CPU:  busy 14%  (system=10% user=3% nice=0% idle=85%)" | cut -b 11-14 

 14%

复制代码

 


 


2.sed


 eg1:去除文本中的所有数字


sed 's/[0-9]//g'

[0-9]匹配一个数字,


s/A/B/ 将A替换为B

g表示全局替换为空格


 


eg2:取当前的接口的ip,把所有的:替换为空格,然后打印出空格为分割的第几个数


复制代码

root@Evelyn:~# ifconfig

ens33     Link encap:Ethernet  HWaddr 00:0c:29:12:22:f9  

          inet addr:192.168.23.44  Bcast:192.168.23.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:1291454 errors:5 dropped:98200 overruns:0 frame:0

          TX packets:645293 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:366412938 (366.4 MB)  TX bytes:261011986 (261.0 MB)

          Interrupt:19 Base address:0x2000 


lo        Link encap:Local Loopback  

          inet addr:127.0.0.1  Mask:255.0.0.0

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:1718636 errors:0 dropped:0 overruns:0 frame:0

          TX packets:1718636 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1 

          RX bytes:1136827513 (1.1 GB)  TX bytes:1136827513 (1.1 GB)


root@Evelyn:~# ifconfig ens33 | grep Bcast | sed 's/:/ /g' | awk '{print $3}'

192.168.23.44

复制代码

eg3:取出延时时间的数字


 ping 192.168.120.1 -s 1000 -c 5 | grep time | sed 's/=/ /g' | awk '{print $10}'



 3. awk


①语法格式:awk  '条件1{动作1}条件2{动作2}...'  文件


条件,一般使用关系表达式作为条件,如a>10。动作,格式化输出或流程控制语句


awk一次读入一整行,默认以tab键或者空格为分隔符将一行分为多个字段,表示为$1、$2、$3...其中$0表示文件名








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


https://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html