1. 程式人生 > >Shell 04 字符串處理、正則表達式

Shell 04 字符串處理、正則表達式

示例 正則表達 變量名 3.4 grep grep -E eof 分割 send

一.字符串的處理 1.字符串截取 1.1 s{}表達式 ${變量名:起始位置:長度} (從0開始) n=number (n="number") echo ${#n} ----> 6 echo ${n:0:4}----> numb echo ${n:1:3} ---> umb 1.2 使用 expr substr 格式:expr substr "$變量名" 起始位置 長度(從1開始) n=number expr substr "$n" 1 3 -----> num expr substr "$n" 2 5 -----> umber 1.3 方式三,使用cut分割工具(從1開始) 格式:echo $變量名 | cut -b 起始位置-結束位置 可省略任何一個 (編號也是從1開始,與expr類似),當省略結束位置時,視為截取到最後 選項 -b 表示按字節截取字符,其中起始位置、結束位置都可以省略。當省略起始位置時,視為從第1個字符開始 n=number echo $n ----> number echo $n | cut -b 1-3 ----> num echo $n | cut -b -3 ----> num echo $n | cut -b 1- ----> number echo $n | cut -b 1,3,5 ----> nme 2.字符串的替換 n=13152098678 2.1 替換第一個 echo ${n/8/x} ----> 1315209x678 2.2 替換全部 echo ${n//8/x} ----> 1315209x67x 3.字符串的刪除 A=`head -1 /etc/passwd` echo A=root:x:0:0:root:/root:/bin/bash 3.1 從左向右,最短距離匹配 格式:${A#*key} echo ${A#*:} --->x:0:0:root:/root:/bin/bash 刪除了:root: 3.2從左向右,最長距離匹配 格式:${A##*key} echo ${A##*:} --->/bin/bash 刪除了:root:x:0:0:root:/root: 3.3 從右向左,最短匹配刪除 格式:${A%key*} echo ${A%:*} ---> root:x:0:0:root:/root 刪除了::/bin/bash 3.4 從右向左,最長匹配刪除 格式:${A%%key*} echo ${A%%:*} ---> root 刪除了::x:0:0:root:/root:/bin/bash 案例: 批量修改文件名 案例:字符串拼接: 1. a=f y被定義: 2. y=$a y=f (1-2步驟等同於:y=$y$a,即可以直接定義賦值) y=$y$a y=ff y=$y$a y=fff ... ... 二.字符串初值的處理 1.常見方法 xx=11 1.1 只取值 格式:${var:-word} 若變量var已存在且非空,則返回$var的值,否則返回字符串“word",原變量var不受影響 echo ${xx:-123qwe} ----> 11 echo ${yy:-456qwe} ----> 456qwe 案例:編寫腳本,從1疊加求和用戶輸入的一個值(初值) #!/bin/bash read -p "Please input a number:" num num=${num:-1} echo $num s=0 i=0 while [ $i -lt $num ] do let i++ let s+=i done echo $s 1.2 數組的定義 # x=(11 22 33) # echo $x ---> 11 # echo ${x[2]} ---> 33 # x[1]=22 # echo ${x[1]} ---> 22 # echo ${x[@]} ---> 11 22 33 # echo ${#x[@]} 數組長度 # echo ${x[@]:起始下標:元素個數} # 數組的另一種賦值方法: m[0]=aaa m[1]=bbb ... 三.expect預期交互 #!/bin/bash expect << EOF #開始 spawn ssh 176.233.6.123 expect "password:" { send "Taren1\r" } expect "#" { send "mkdir /opt/zhangkai\r" } expect "#" { send "exit\r" } EOF #結束 四.正則表達式 1.egrep過濾工具 基本用法:egrep [選項] ‘正則表達式‘ 文件 前值命令 | egrep [選項] ‘正則表達式‘ grep -E 標示允許使用擴展的正則表達式 -i 忽略字母大小寫 -v 條件取反 -c 統計匹配的行數 -q 無任何輸出,一般用於檢測($?) -n 顯示出匹配結果所在的行號 --color 標紅顯示匹配字串 # grep -c root /etc/passwd (輸出的是一共匹配的行數) # grep --color root /etc/passwd 2.基本元素處理 2.1 行首/行尾/單字匹配 ^ 匹配行首 ^abc 以abc開頭的行 $ 匹配行尾 abc$ 以abc結尾的行 ^$ 空行 [ ] 匹配集合中任意單個字符 [ ^ ] 對集合取反 . 單個字符 . 除過“\n”以外的任意單個字符 \{n,m\} 匹配任一個字符n-m次 (優先匹配大數,依次往小去匹配) 示例:egrep ‘^#‘ /etc/inittab egrep -c ‘/bin/bash$‘ /etc/passwd == egrep ‘/bin/bash$‘ /etc/passwd | wc -l =5(行數) egrep -m10 ‘/sbin/nologin$‘ /etc/passwd (只匹配10行,不是前10行,是中標後列出中標的10行) grep -v ‘.‘ /etc/rc.local == egrep ‘^$‘ /etc/rc.local grep -n ‘a\{3,4\} --->aaa aaaa aaa grep -n ‘a\{3,\} ---> aaa (匹配3次及3次以上,由高往底匹配)g (.表示有一個字就行,前面-v表示一個字都沒有,即空行) 2.2 +、?、* -----> 目標出現的次數 類型 含義 示例 說明 + 最少匹配一次 a+ 一個或多個連續的a (abc)+ 一個或多個連續的abc ? 最多匹配一次 a? 0個或1個a (abc)? 0個或1個abc * 匹配任意次數 a* 0個或多個連續的a (abc)* 0個或多個連續的abc .* 任意長度的任意字符串 2.3 限定次數

Shell 04 字符串處理、正則表達式