Linux 使用 shell 指令碼處理字串
1. 擷取字串的前8位
expr substr "$string" 1 8
echo $string | awk '{print substr(,1,8)}'
echo $string | cut -c1-8
echo $string | dd bs=1 count=8 2>/dev/null
2. 分割、替換字串
2.1 命令說明
符號 | 釋義 |
---|---|
* | 萬用字元,用於匹配字串將被刪除的子串 |
. | 分割符,可以為任意一個或多個字元 |
% | 從右向左匹配 |
# | 從左向右匹配 |
/ | 表示替換 |
% # / | 非貪婪匹配,即匹配符合萬用字元的最短結果 |
% ## // | 貪婪匹配,即匹配符合萬用字元的最長結果 |
示例 | 含義 |
---|---|
${#VALUE} | 計算VALUE字串的字元數量 |
${VALUE%.*} 或 ${VALUE%%.*} | 刪除VALUE字串中以分隔符"."匹配的右側字元,保留左側字元 |
${VALUE#*.} 或 ${VALUE##*.} | 刪除VALUE字串中以分隔符"."匹配的左側字元,保留右側字元 |
${VALUE/OLD/NEW} 或 ${VALUE//OLD/NEW} | 用NEW子串替換VALUE字串中匹配的OLD子串 |
2.2 應用例項
定義變數name=odysee_odysee
- 計算VALUE字串的字元數量
echo ${#name} # 輸出結果 13
- 刪除VALUE字串中以分隔符"."匹配的右側字元,保留左側字元
# 非貪婪匹配
echo ${name%y*} # 輸出結果 odysee_od
# 貪婪匹配
echo ${name%%y*} # 輸出結果 od
- 刪除VALUE字串中以分隔符"."匹配的左側字元,保留右側字元
# 非貪婪匹配
echo ${name#*y} # 輸出結果 see_odysee
# 貪婪匹配
echo ${name##*y} # 輸出結果 see
- 用NEW子串替換VALUE字串中匹配的OLD子串
# 非貪婪匹配
echo ${name/o/O} #輸出結果 Odysee_odysee
# 貪婪匹配
echo ${name//o/O} #輸出結果 Odysee_Odysee
3. 字串擷取
3.1 命令說明
示例 | 含義 |
---|---|
${VALUE:POSITION} | 在字串VALUE中,從位置POSITION開始提取子串(從左到右匹配) |
${VALUE:POSITION:LENGTH} | 在字串VALUE中,從位置POSITION開始提取長度為LENGTH的子串(從左到右匹配) |
${VALUE:0-OFFSET} | 在字串VALUE中,從右到左擷取OFFSET個字元 |
${VALUE:0-OFFSET:LENGTH} | 在字串VALUE中,從右到左擷取OFFSET個字元的前LENGTH個 |
3.2 應用例項
定義變數name=mynameisodysee
- 在字串name中,從位置2開始提取子串(從左到右匹配)
echo ${name:2} # 輸出結果 nameisodysee
- 在字串name中,從位置2開始提取長度為4的子串(從左到右匹配)
echo ${name:2:4} # 輸出結果 name
- 在字串name中,從右到左擷取8個字元
echo ${name:0-8} # 輸出結果 isodysee
- 在字串name中,從右到左擷取8個字元的前兩個
echo ${name:0-8:2} # 輸出結果 is
- 定義變數
string=abc12342341
,以下為擷取示例
echo ${string:4} # 從第4位開始擷取後面所有字串,輸出結果:2342341
echo ${string:3:3} # 從第3位開始擷取後面3位,輸出結果:123
echo ${string:3:6} #從第3位開始擷取後面6位,輸出結果:123423
echo ${string: -4} #擷取後4位,輸出結果:2341
echo ${string:(-4)} #同上
expr substr $string 3 3 #從第3位開始擷取後面3位,輸出結果123
- 定義變數
str="abcdef"
,以下為擷取示例
expr substr "$str" 1 3 # 從第一個位置開始取3個字元,輸出結果:abc
expr substr "$str" 2 5 # 從第二個位置開始取5個字元,輸出結果:bcdef
expr substr "$str" 4 5 # 從第四個位置開始取5個字元,輸出結果:def
echo ${str:2} # 從第二個位置開始提取字串,輸出結果:bcdef
echo ${str:2:3} # 從第二個位置開始提取3個字元,輸出結果:bcd
echo ${str:(-6):5} # 從倒數第二個位置向左提取字串,輸出結果:abcde
echo ${str:(-4):3} # 從倒數第二個位置向左提取6個字元,輸出結果:cde
4. 判斷變數的值
4.1 命令說明
示例 | 含義 |
---|---|
${string-DEFAULT} | 如果string變數未定義,返回值為DEFAULT的值,否則返回變數的值 |
${string:-DEFAULT} | 如果string變數未定義,或者其值為空,返回值為DEFAULT的值,否則返回變數的值 |
${string=DEFAULT} | 如果string變數未定義,返回值為DEFAULT的值,並將DEFAULT賦值給string,否則返回變數的值 |
${string:=DEFAULT} | 如果string變數未定義,或者其值為空,返回值為DEFAULT的值, 並將DEFAULT賦值給string,否則返回變數的值 |
${string+DEFAULT} | 如果string已賦值,其值用DEFAULT替換,否則不進行任何替換 |
${string:+DEFAULT} | 如果string已賦值,其值用DEFAULT替換,否則不進行任何替換 |
${string?ERR_MSG} | 當變數未被定義時,將ERR_MSG訊息傳送到標準錯誤輸出 |
${string:?ERR_MSG} | 當變數未被賦值時,將ERR_MSG訊息傳送到標準錯誤輸出 |
4.2 應用例項
- ${string-DEFAULT}:如果string變數未定義,返回值為DEFAULT的值,否則返回變數的值
# 未定義string變數
echo ${string-string 變數未定義} # 輸出結果:string 變數未定義
# 定義string變數,但值為空(會返回空值)
string=
echo ${string-string 變數未定義} # 輸出結果為空
# 定義string變數並賦值
string=test
echo ${string-string 變數未定義} # 輸出結果:test
- ${string:-DEFAULT}:如果string變數未定義,或者其值為空,返回值為DEFAULT的值,否則返回變數的值
# 未定義string變數
echo ${string:-string 變數未定義} # 輸出結果:string 變數未定義
# 定義string變數,但值為空
string=
echo ${string:-string 變數值為空} # 輸出結果:string 變數值為空
# 定義string變數並賦值
string=test
echo ${string:-string 變數值為空} # 輸出結果:test
- ${string=DEFAULT}:如果string變數未定義,返回值為DEFAULT的值,並將DEFAULT賦值給string,否則返回變數的值
# 未定義string變數
echo ${string=123} # 輸出結果:123
echo ${string} # 輸出結果:123
# 定義string變數,但值為空(會返回空值)
string=
echo ${string=123} # 輸出結果為空
echo ${string}
# 定義string變數並賦值
string=test
echo ${string=123} # 輸出結果:test
echo ${string} # 輸出結果:test
- ${string:=DEFAULT}:如果string變數未定義,或者其值為空,返回值為DEFAULT的值,並將DEFAULT賦值給string,否則返回變數的值
# 未定義string變數
echo ${string:=123} # 輸出結果:123
echo ${string} # 輸出結果:123
# 定義string變數,但值為空
string=
echo ${string:=123} # 輸出結果:123
echo ${string} # 輸出結果:123
#定義string變數並賦值
string=test
echo ${string:=123} # 輸出結果:test
echo ${string} # 輸出結果:test
- ${string+DEFAULT}:如果string已賦值,其值用DEFAULT替換,否則不進行任何替換
# 未定義string變數
echo ${string+123} # 輸出結果為空
echo ${string} # 輸出結果為空
# 定義string變數,但值為空
string=
echo ${string+123} # 輸出結果:123
echo ${string} # 輸出結果為空
# 定義string變數並賦值
string=test
echo ${string+123} # 輸出結果:123
echo ${string} # 輸出結果:test
- ${string:+DEFAULT}:如果string已賦值,其值用DEFAULT替換,否則不進行任何替換
# 未定義string變數
echo ${string:+123} # 輸出結果為空
echo ${string} # 輸出結果為空
# 定義string變數,但值為空
string=
echo ${string:+123} # 輸出結果為空
echo ${string} # 輸出結果為空
# 定義string變數並賦值
string=test
echo ${string:+123} # 輸出結果:123
echo ${string} # 輸出結果:test
- ${string?ERR_MSG}:當變數未被定義時,將ERR_MSG訊息傳送到標準錯誤輸出
# 未定義string變數
echo ${string?輸出錯誤資訊} # 輸出結果:-bash: string: 輸出錯誤資訊
echo ${string} # 輸出結果為空
# 定義string變數,但值為空
string=
echo ${string?輸出錯誤資訊} # 輸出結果為空
echo ${string} # 輸出結果為空
# 定義string變數並賦值
string=test
echo ${string?輸出錯誤資訊} # 輸出結果:test
echo ${string} # 輸出結果:test
- ${string:?ERR_MSG}:當變數未被賦值時,將ERR_MSG訊息傳送到標準錯誤輸出
# 未定義string變數
echo ${string:?輸出錯誤資訊} # 輸出結果:-bash: string: 輸出錯誤資訊
echo ${string} # 輸出結果為空
# 定義string變數,但值為空
string=
echo ${string:?輸出錯誤資訊} # 輸出結果:-bash: string: 輸出錯誤資訊
echo ${string} # 輸出結果為空
# 定義string變數並賦值
string=test
echo ${string:?輸出錯誤資訊} # 輸出結果:test
echo ${string} # 輸出結果:test
5. 獲取字串長度
# 定義變數string=abc12342341
echo ${#string} # 輸出結果 11
expr length $string # 輸出結果 11
expr "$string" : ".*" # 分號二邊要有空格,這裡的:根match的用法差不多
6. 獲取字串所在位置
# 定義變數str="abc"
expr index $str "a" # 輸出結果 1
expr index $str "b" # 輸出結果 2
expr index $str "x" # 輸出結果 0
expr index $str "" # 輸出結果 0
7. 獲取從字串開頭到子串的最大長度
# 定義變數string=abc12342341
expr match $string 'abc.*3' # 輸出結果 9
8. 顯示匹配的內容
# 定義變數string=abc12342341
expr match $string '\([a-c]*[0-9]*\)' # 輸出結果 abc12342341
expr $string : '\([a-c]*[0-9]\)' # 輸出結果 abc1
expr $string : '.*\([0-9][0-9][0-9]\)' # 輸出結果 341 顯示括號中匹配的內容
9. 顯示不匹配的內容
# 定義變數string=abc12342341
echo ${string#a*3} # 從$string左邊開始,去掉最短匹配子串,輸出結果:42341
echo ${string#c*3} # 這樣什麼也沒有匹配到,輸出結果:abc12342341
echo ${string#*c1*3} # 從$string左邊開始,去掉最短匹配子串,輸出結果:42341
echo ${string##a*3} # 從$string左邊開始,去掉最長匹配子串,輸出結果:41
echo ${string%3*1} # 從$string右邊開始,去掉最短匹配子串,輸出結果:abc12342
echo ${string%%3*1} # 從$string右邊開始,去掉最長匹配子串,輸出結果:abc12
# 定義變數str="abbc,def,ghi,abcjkl"
echo ${str#a*c} # 輸出結果:def,ghi,abcjkl 一個井號(#) 表示從左邊擷取掉最短的匹配 (這裡把abbc字串去掉)
echo ${str##a*c} # 輸出結果:jkl 兩個井號(##) 表示從左邊擷取掉最長的匹配 (這裡把abbc,def,ghi,abc字串去掉)
echo ${str#"a*c"} # 輸出結果:abbc,def,ghi,abcjkl 因為str中沒有"a*c"子串
echo ${str##"a*c"} # 輸出結果:abbc,def,ghi,abcjkl 同理
echo ${str#*a*c*} # 輸出結果:空
echo ${str##*a*c*} # 輸出結果:空
echo ${str#d*f} # 輸出結果:abbc,def,ghi,abcjkl,
echo ${str#*d*f} # 輸出結果:ghi,abcjkl
echo ${str%a*l} # 輸出結果:abbc,def,ghi 一個百分號(%)表示從右邊擷取最短的匹配
echo ${str%%b*l} # 輸出結果:a 兩個百分號表示(%%)表示從右邊擷取最長的匹配
echo ${str%a*c} # 輸出結果:abbc,def,ghi,abcjkl
# 這裡要注意,必須從字串的第一個字元開始,或者從最後一個開始,可以這樣記憶, 井號(#)通常用於表示一個數字,它是放在前面的;百分號(%)解除安裝數字的後面; 或者這樣記憶,在鍵盤佈局中,井號(#)總是位於百分號(%)的左邊(即前面)
10. 去掉字串末尾的字元
使用df -Th獲取磁碟資訊,並將使用率賦給變數來與閾值進行對比,如果存在%號無法進行對比,所以需要去掉變數中的%號,可以使用${var%?}的格式來去掉最後一個字元
#!/bin/bash
root_usage=$(df -TPh | grep -w "/" | awk '{print $6}')
echo ${root_usage%?}
相關文章
- 【轉】shell指令碼處理字串的常用方法指令碼字串
- 使用批處理指令碼或SHELL配合SQL指令碼指令碼SQL
- Linux shell指令碼的字串擷取Linux指令碼字串
- shell字串處理總結字串
- shell中字串的處理字串
- Shell指令碼逐行處理文字檔案技巧指令碼
- 【轉載】SHELL字串處理技巧(${}、##、%%)字串
- Linux Shell指令碼Linux指令碼
- Linux shell 指令碼Linux指令碼
- shell指令碼字串和陣列的使用操作方法指令碼字串陣列
- Linux shell 指令碼分享Linux指令碼
- (轉)Shell常用處理字串方法(備查)字串
- shell指令碼文字處理工具指令碼
- 將DOS批處理檔案轉換為Shell指令碼指令碼
- 處理stdin輸入的字串指令字串
- linux shell小指令碼分享Linux指令碼
- linux常用的shell指令碼Linux指令碼
- Linux/Unix shell 指令碼中呼叫SQL,RMAN指令碼Linux指令碼SQL
- 寫個批處理指令碼來幫忙幹活---遍歷資料夾&字串處理指令碼字串
- shell不得不知的“內建字串處理”字串
- Linux基礎五(shell指令碼)Linux指令碼
- Linux 【Shell指令碼經典案例】Linux指令碼
- 【Linux】【Shell】主控指令碼實現Linux指令碼
- linux shell 指令碼攻略筆記Linux指令碼筆記
- Linux Shell指令碼系列之二Linux指令碼
- Linux Shell指令碼系列之一Linux指令碼
- Linux Shell 指令碼面試 25 問Linux指令碼面試
- Linux Shell指令碼面試25問Linux指令碼面試
- linux shell指令碼中 =~ 的作用Linux指令碼
- shell指令碼擷取字串字尾名,檔名指令碼字串
- Shell指令碼介紹與使用指令碼
- hive streaming 使用shell指令碼Hive指令碼
- 使用shell定製awr指令碼指令碼
- Shell指令碼中cd命令使用指令碼
- SQL Server TEXT型別欄位字串替換示例處理指令碼SQLServer型別字串指令碼
- 使用 Shell 指令碼監控 Linux 系統程式資源指令碼Linux
- 使用Linux系統的Shell指令碼維護Oracle(轉)Linux指令碼Oracle
- 使用shell指令碼在Linux中管理Java應用程式指令碼LinuxJava