linux?shell字符串截取的詳細(xì)總結(jié)(實(shí)用!)
一、字符串變量的截取操作
對(duì)字符串變量的截取操作一般都是通過(guò)${操作符}的方式進(jìn)行,如下:
1.從指定位置(index)截取固定長(zhǎng)度
格式:${string:start:length}
其中,string 是要截取的字符串,start 是起始位置(下標(biāo)從 0 開(kāi)始計(jì)數(shù)),length 是要截取的長(zhǎng)度(省略的話(huà)表示直到字符串的末尾)
例如:
str_time='2022-02-01 12:30:58'
date_no=${str_time:0:10}? ? ? ? ? #截取前面10位字符:2022-01-01
date_mon=${str_time:5:2}? ? ? ? ?#從前面第6位開(kāi)始截取2位字符:02
date_time=${str_time:0-8}? ? ? ? ?#截取后面8位字符:12:30:58
date_hh=${str_time:0-8:2}? ? ? ? ?#截取后面8位字符的前面兩位:122.截取指定字符串(子字符串)左邊的字符
格式1:${string%substr*} #匹配從右往左第一個(gè)substr
格式2:${string%%substr*} #匹配從右往左最后一個(gè)substr
說(shuō)明:上面%的運(yùn)算實(shí)際上可以理解為,刪除substr以及substr右邊的任意字符串,*號(hào)在substr右邊,從而得到substr左邊剩余字符串。 格式1和格式2的區(qū)別是匹配substr的位置
例如:
v_str='/app/logs/133.38.112.177_202204111015.log'
echo ${v_str%/*}? ? ? ? ? ? ? #截取從右往左第一個(gè)'/' 左邊的字符:/app/logs
echo ${v_str%%/*}? ? ? ? ? ?#截取從右往左最后個(gè)'/' 左邊的字符:空3.截取指定字符串(子字符串)右邊的字符
格式1:${string#*substr} #匹配從左往右第一個(gè)substr
格式2:${string##*substr} #匹配從左往右最后一個(gè)substr
說(shuō)明:上面'#'的運(yùn)算實(shí)際上可以理解為,刪除substr以及substr左邊的任意字符串,*號(hào)在substr的左邊,從而得到substr右邊剩余字符串。 格式1和格式2的區(qū)別是匹配substr的位置
例如:
v_str='/app/logs/133.38.112.177_202204111015.log'
#截取從左往右第一個(gè)'/' 右邊的字符:app/logs/133.38.112.177_202204111015.log
echo ${v_str#*/}
#截取從左往右最后個(gè)'/' 右邊的字符:133.38.112.177_202204111015.log
echo ${v_str##*/}注意:用%和#截取字符串的用法,比較容易忘記容易混淆。
有個(gè)小技巧加以區(qū)別:
鍵盤(pán)上#號(hào)在$符號(hào)的左邊,所以是操作并刪除左邊字符,所以*在substr左邊,一個(gè)#號(hào)代表取第一個(gè)substr(從左往右):${string#*substr}
鍵盤(pán)上%號(hào)在$符號(hào)的右邊,所以是操作并刪除右邊字符,所以*在substr的右邊,一個(gè)%代表取第一個(gè)substr(從右往左):${string%substr*}
二、用cut命令截取(適合處理管道流或行文本字符)
格式:cut OPTION... [FILE]
cut 命令從文件的每一行剪切字節(jié)、字符和字段并將這些字節(jié)、字符和字段寫(xiě)至標(biāo)準(zhǔn)輸出。
如果不指定 File 參數(shù),cut 命令將讀取標(biāo)準(zhǔn)輸入。必須指定 -b、-c 或 -f 標(biāo)志之一。
OPTION:
- -b :以字節(jié)為單位選取指定的字節(jié)數(shù)
- -c :以字符為單位選取指定的字符數(shù)
- -d :指定分隔符(默認(rèn)是tab)將字符串分為多個(gè)區(qū)域,一般與-f參數(shù)一起使用
- -f :與-d一起使用,指定選取哪個(gè)區(qū)域
- -n :取消分割多字節(jié)字符。僅和 -b 標(biāo)志一起使用。如果字符的最后一個(gè)字節(jié)落在由 -b 標(biāo)志的 List 參數(shù)指示的范圍之內(nèi),該字符將被寫(xiě)出;否則,該字符將被排除
用法:
例如:處理test.txt文件,截取每一行的指定字符
$?cat test.txt? a_202204110214_10.251.82.225 b_202204110215_10.251.82.223 b_202204110212_10.251.82.226 c_202204110214_10.251.82.228 -b選項(xiàng): $ cut -b 1,3 test.txt? ?#截取1,3字節(jié) a2 b2 b2 c2 $ cut -b 1-3 test.txt? ?#截取1到3字節(jié) a_2 b_2 b_2 c_2 -c選項(xiàng): $ cut -c 1,3 test.txt? ?#截取1,3字符 a2 b2 b2 c2 $ cut -c 1-3 test.txt? ?#截取1到3字符 a_2 b_2 b_2 c_2 -d -f選項(xiàng): $ cut -d'_' -f3 test.txt? ?#以下劃線(xiàn)分割,取第三個(gè)區(qū)域字符 10.251.82.225 10.251.82.223 10.251.82.226 10.251.82.228 $ cat test.txt | cut -d'_' -f3? ?#結(jié)合管道使用效果一樣
補(bǔ)充:使用%和%%:截取的是指定字符前邊內(nèi)容
val=“hello++world++shell”
echo ${val%++*}
# 刪除最后一個(gè) ++ 后邊字符,截取前邊剩下的內(nèi)容
# 輸出: hello++world
echo ${val%%++*}
# 刪除第一個(gè) ++ 后邊字符,只截取保留第一個(gè) ++ 前邊的內(nèi)容
# 輸出: hello?示例 截取文件名字,去掉后綴
str_file="123.hello.json"
echo ${str_file%.*}
# 刪除最后一個(gè) . 后邊的json,截取123.hello
# 輸出: 123.hello總結(jié)
到此這篇關(guān)于linux shell字符串截取的文章就介紹到這了,更多相關(guān)linux shell字符串截取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
5個(gè)Shell腳本編程入門(mén)練習(xí)例子
這篇文章主要介紹了5個(gè)Shell腳本編程入門(mén)例子,涵蓋了各種操作,又有一些游戲的性質(zhì),作為入門(mén)練習(xí)例子是不很不錯(cuò)的,需要的朋友可以參考下2014-06-06
Linux中根據(jù)一個(gè)單詞快速鎖定到日志的操作命令
這篇文章給大家介紹了Linux中如何根據(jù)一個(gè)單詞快速鎖定到日志,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01
linux中shell腳本實(shí)現(xiàn)下載完關(guān)機(jī)
本文給大家分享的是個(gè)人在實(shí)際應(yīng)用中制作的一個(gè)小程序,十分的實(shí)用,推薦給大家,有需要的小伙伴可以參考下。2015-03-03
解決centos7 開(kāi)機(jī)/etc/rc.local 不執(zhí)行的問(wèn)題
下面小編就為大家?guī)?lái)一篇解決centos7 開(kāi)機(jī)/etc/rc.local 不執(zhí)行的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
Ubuntu服務(wù)器配置apache2.4的限速功能shell腳本分享
這篇文章主要介紹了Ubuntu服務(wù)器配置apache2.4的限速功能shell腳本分享,本文直接給出腳本實(shí)現(xiàn)代碼,代碼相關(guān)原理都寫(xiě)在了注釋里,需要的朋友可以參考下2015-03-03

