linux shell字符串截取的詳細總結(實用!)
一、字符串變量的截取操作
對字符串變量的截取操作一般都是通過${操作符}的方式進行,如下:
1.從指定位置(index)截取固定長度
格式:${string:start:length}
其中,string 是要截取的字符串,start 是起始位置(下標從 0 開始計數),length 是要截取的長度(省略的話表示直到字符串的末尾)
例如:
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位開始截取2位字符:02 date_time=${str_time:0-8} #截取後面8位字符:12:30:58 date_hh=${str_time:0-8:2} #截取後面8位字符的前面兩位:12
2.截取指定字符串(子字符串)左邊的字符
格式1:${string%substr*} #匹配從右往左第一個substr
格式2:${string%%substr*} #匹配從右往左最後一個substr
說明:上面%的運算實際上可以理解為,刪除substr以及substr右邊的任意字符串,*號在substr右邊,從而得到substr左邊剩餘字符串。 格式1和格式2的區別是匹配substr的位置
例如:
v_str='/app/logs/133.38.112.177_202204111015.log' echo ${v_str%/*} #截取從右往左第一個'/' 左邊的字符:/app/logs echo ${v_str%%/*} #截取從右往左最後個'/' 左邊的字符:空
3.截取指定字符串(子字符串)右邊的字符
格式1:${string#*substr} #匹配從左往右第一個substr
格式2:${string##*substr} #匹配從左往右最後一個substr
說明:上面'#'的運算實際上可以理解為,刪除substr以及substr左邊的任意字符串,*號在substr的左邊,從而得到substr右邊剩餘字符串。 格式1和格式2的區別是匹配substr的位置
例如:
v_str='/app/logs/133.38.112.177_202204111015.log' #截取從左往右第一個'/' 右邊的字符:app/logs/133.38.112.177_202204111015.log echo ${v_str#*/} #截取從左往右最後個'/' 右邊的字符:133.38.112.177_202204111015.log echo ${v_str##*/}
註意:用%和#截取字符串的用法,比較容易忘記容易混淆。
有個小技巧加以區別:
鍵盤上#號在$符號的左邊,所以是操作並刪除左邊字符,所以*在substr左邊,一個#號代表取第一個substr(從左往右):${string#*substr}
鍵盤上%號在$符號的右邊,所以是操作並刪除右邊字符,所以*在substr的右邊,一個%代表取第一個substr(從右往左):${string%substr*}
二、用cut命令截取(適合處理管道流或行文本字符)
格式:cut OPTION… [FILE]
cut 命令從文件的每一行剪切字節、字符和字段並將這些字節、字符和字段寫至標準輸出。
如果不指定 File 參數,cut 命令將讀取標準輸入。必須指定 -b、-c 或 -f 標志之一。
OPTION:
- -b :以字節為單位選取指定的字節數
- -c :以字符為單位選取指定的字符數
- -d :指定分隔符(默認是tab)將字符串分為多個區域,一般與-f參數一起使用
- -f :與-d一起使用,指定選取哪個區域
- -n :取消分割多字節字符。僅和 -b 標志一起使用。如果字符的最後一個字節落在由 -b 標志的 List 參數指示的范圍之內,該字符將被寫出;否則,該字符將被排除
用法:
例如:處理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選項: $ cut -b 1,3 test.txt #截取1,3字節 a2 b2 b2 c2 $ cut -b 1-3 test.txt #截取1到3字節 a_2 b_2 b_2 c_2 -c選項: $ 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選項: $ cut -d'_' -f3 test.txt #以下劃線分割,取第三個區域字符 10.251.82.225 10.251.82.223 10.251.82.226 10.251.82.228 $ cat test.txt | cut -d'_' -f3 #結合管道使用效果一樣
補充:使用%和%%:截取的是指定字符前邊內容
val=“hello++world++shell” echo ${val%++*} # 刪除最後一個 ++ 後邊字符,截取前邊剩下的內容 # 輸出: hello++world echo ${val%%++*} # 刪除第一個 ++ 後邊字符,隻截取保留第一個 ++ 前邊的內容 # 輸出: hello
示例 截取文件名字,去掉後綴
str_file="123.hello.json" echo ${str_file%.*} # 刪除最後一個 . 後邊的json,截取123.hello # 輸出: 123.hello
總結
到此這篇關於linux shell字符串截取的文章就介紹到這瞭,更多相關linux shell字符串截取內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Shell編程之變量的高級用法詳解
- linux shell 編程之函數使用詳解
- shell 流程控制語句的具體使用
- Shell腳本中$符號的幾種用法小結
- 詳解Shell腳本控制docker容器啟動順序