Linux下實(shí)現(xiàn)字符串截取,大體上可以分為兩種,使用命令實(shí)現(xiàn)截取,使用工具實(shí)現(xiàn)截取。具體截取方式如下:
a、#截取,可以實(shí)現(xiàn)刪除左邊字符,保留右邊字符
? ? 從左邊第一個(gè)開始,刪除及之前的所有字符
?str=http://www.baidu.com/index.html?
echo ${str#*/}? ? ? ? # right first /?
輸出:?
? ? /www.baidu.com/index.html
b、##截取,可以實(shí)現(xiàn)刪除左邊字符,保留右邊字符
? ? 從最右邊的開始,刪除及之前的所有字符
?str=http://www.baidu.com/index.html?
echo ${str##*/}? ? ? ? # rightest /?
輸出:?
? ? index.html
c、%截取,可以實(shí)現(xiàn)刪除右邊字符,保留左邊字符
? ? 從右邊第一個(gè)開始刪除及右邊的所有字符
?str=http://www.baidu.com/index.html?
echo ${str%/*}? ? ? ? # left firft /?
輸出:?
? ? http://www.baidu.com
d、%%截取,可以實(shí)現(xiàn)刪除右邊字符,保留左邊字符
從左邊第一個(gè)開始刪除及右邊的所有字符
?str=http://www.baidu.com/index.html?
echo ${str%%/*}? ? ? ? # leftest /?
輸出:?
? ? http:
e、區(qū)間截取
? ? 截取第0~6個(gè)字符
?str=http://www.baidu.com/index.html?
echo ${str:0:6}?
輸出:?
? ? http:/
f、正向區(qū)間截取到結(jié)束
? ? 截取從第7個(gè)字符開始到結(jié)束
?str=http://www.baidu.com/index.html?
echo ${str:7}?
輸出:?
? ? www.baidu.com/index.html
g、反向區(qū)間截取
? ? 截取倒數(shù)第0到第7個(gè)字符的前5個(gè)
?str=http://www.baidu.com/index.html?
echo ${str:0-7:5}?
輸出:?
? ? ex.ht
h、反向截取,到結(jié)束
? ? 從倒數(shù)第10個(gè)字符截取到字符串結(jié)束
?str=http://www.baidu.com/index.html?
echo ${str:0-10}?
輸出:?
? ? index.html
i、使用cut命令實(shí)現(xiàn)字符串截取
? ? ? cut [選項(xiàng)]?
? ? ? ? ? 選項(xiàng):? ? -b? ----> 字節(jié)?
? ? ? ? ? ? ? ? ? -c? ----> 字符?
? ? ? ? ? ? ? ? ? -f? ----> 域?
已創(chuàng)建一個(gè)文件,內(nèi)容如下:?
[linuxidc@localhost 3_26]$ cat file
abcdefg?
1234567?
poiuytr
使用cut截取的例子如下:
[linuxidc@localhost 3_26]$ cat file | cut -b 3?
c?
3?
i?
[linuxidc@localhost 3_26]$ cat file | cut -b -3?
abc?
123?
poi?
[linuxidc@localhost 3_26]$ cat file | cut -b 3-?
cdefg?
34567?
iuytr?
[linuxidc@localhost 3_26]$ cat file | cut -b 3-5?
cde?
345?
iuy?
[linuxidc@localhost 3_26]$ cat file | cut -b 3-5,7?
cdeg?
3457?
iuyr
對(duì)于單字節(jié)而言,-b和-c似乎作用是一樣的,但是如果文本內(nèi)出現(xiàn)中文的情況下,-c是可以正確輸出一個(gè)漢字的,但使用-b選項(xiàng)輸出的卻是亂碼,因?yàn)橐粋€(gè)中文是兩個(gè)字節(jié)。為了解決這個(gè)問題,通常-b選項(xiàng)和-n選項(xiàng)配合使用,-n用于告訴cut要截取的是n字節(jié)字符。
下面解釋域<-f>的作用。在/etc/passwd文件中保存了所有的用戶信息,仔細(xì)了解過的話,可以發(fā)現(xiàn),每一長(zhǎng)串是通過 : 分隔開的。我們可以認(rèn)為該文件中的數(shù)據(jù)是以 : 分隔不同的域。指定域分隔符使用的是 -d 選項(xiàng),-f后跟的數(shù)字格式和-b完全一致?!綾ut的域分隔符只能是一個(gè)字符】
123456789101112 [linuxidc@localhost 3_26]$ cat /etc/passwd | head -n 5?
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[linuxidc@localhost 3_26]$ cat /etc/passwd | head -n 5 | cut -d : -f 1?
root?
bin?
daemon?
adm?
lp
多余說一點(diǎn),看下面的例子
[linuxidc@localhost 3_26]$ ps
? PID TTY? ? ? ? ? TIME CMD?
?5630 pts/2? ? 00:00:00 bash
?5739 pts/2? ? 00:00:00 ps
[linuxidc@localhost 3_26]$ ps | cut -b 4?
I?
3?
4?
4
明明只有三行,卻cut出了四個(gè)行內(nèi)容,原因就在與每個(gè)命令其實(shí)都是父bash單獨(dú)創(chuàng)建的一個(gè)進(jìn)程,cut也不例外(內(nèi)置命令除外)。
?
評(píng)論
查看更多