首頁 > 軟體

linux shell字串擷取的詳細總結(實用!)

2022-07-27 22:04:05

一、字串變數的擷取操作

對字串變數的擷取操作一般都是通過${操作符}的方式進行,如下:

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字串擷取內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com