字串處理
子串截取
方法一:使用${}表達式
格式:echo ${x:起始位置:長度}(起始位置編號從0開始,可省略)
方法二:使用expr substr
格式:expr substr "$x" 起始位置 長度(起始位置編號從1開始)
方法三:使用cut工具
格式:ceho $x|cut -b 起始位置-結束位置(起始位置編號從1開始)
-b:字節過濾
-c:過濾字符
-f:過濾列
示例:截取QQ1520029989
[root@ceshiji ~]# x=1520029989
[root@ceshiji ~]# echo $x
1520029989
方法一:[root@ceshiji ~]# echo ${x:0:5}
QQ152
方法二:[root@ceshiji ~]# expr substr "$x" 1 7
QQ15200
方法三:[root@ceshiji ~]# echo $x|cut -b 1-8
QQ152002
路勁分割:
取目錄位置
格式:dirname "字符串"(截取文件名)
[root@ceshiji ~]# dirname /a/c/b/c.txt
/a/c/b
取文檔的基本名稱
格式:basename "字符串"(截取路勁)
[root@ceshiji ~]# basename /a/c/b/c.txt
c.txt
字串替換的方法:
只替換第一個匹配結果
格式:echo ${/var/old/new}
[root@ceshiji ~]# a=123456
[root@ceshiji ~]# echo ${a/3/x}
12x456
替換全部匹配結果
格式:echo ${var//old/new}
[root@ceshiji ~]# a=12345353
[root@ceshiji ~]# echo ${a//3/x}
12x45x5x
[root@ceshiji ~]# echo ${a//53/xz}
1234xzxz
——————————————————————————————————————————
字符串的掐頭去尾
字符串掐頭(#用來刪除頭部,*通配)
從左向右,最短匹配刪除
格式:echo ${變量名#*關鍵詞}
[root@ceshiji ~]# x=`head -1 /etc/passwd`(x變量=head -1 /etc/passwd命令,)
[root@ceshiji ~]# echo ${x#*:}
x:0:0:root:/root:/bin/bash
從右向左,最長匹配刪除
格式:echo ${變量名##*關鍵詞}
[root@ceshiji ~]# echo ${x##*:}
/bin/bash
字符串去尾(%用來刪除頭部,*通配)
從左向右,最短匹配刪除
格式:echo ${變量名%關鍵詞*}
從右向左,最長匹配刪除
格式:echo ${變量名%%關鍵詞*}
批量改擴展文件名
[root@ceshiji ~]# vim a.sh
#!/bin/bash
for i in `ls *.$1`
do
mv $i ${i%.*}.$2
done
變量賦初始值
若變量xx已經存在且非null,則返回$xx的值
否則返回字符hydra,變量xx值不變
取值:${xx:-hydra}
[root@ceshiji ~]# echo ${b:-ok}
ok
[root@ceshiji ~]# b=1520029989
[root@ceshiji ~]# echo ${b:-ok}
1520029989
[root@ceshiji ~]# vim a.sh
#!/bin/bash
read -p "admin:" user
read -p "pass:" pass
user=${user:-tom}
pass=${pass:-123}
useradd $user
echo "pass" |passwd --stdin $user
———————————————————————————————————
expect簡介
基於TCL編寫的自動交互式程序
可以用在shell腳本中,為交互式過程自動傳輸預先准備的文本或指令
無需人工干預,觸發的依據是預期會出現的特征提示文本
但是expect不支持變量,但可以將expect內置到shell腳本中
實例:
將expect內置到shell腳本中實現ssh自動登陸,並遠程執行指令
spawn:啟動程序
expect:屏幕出現什么識別什么
send自動執行
[root@ceshiji ~]# vim expect.sh
#!/bin/bash
for i in 1..253
do
expect <<EOF
spawn ssh 192.168.4.$i
expect{
"yes/no" {send "yes\r";exp_continue}
"password" {send "Taren1"}
# {send "mkdir /hydra\r"}
# {send "exit\r"}
}
EOF
done
————————————————————————————————————————
正則表達式
數組:變量 [存多個值]
a=(11 22 33 xx yy)
echo ${a=[0]}(調用變量)
grep過濾命令
基本用法:
格式一:grep [選項] '正則表達式' 文件
格式二:前置命令 |grep [選項] '正則表達式'
常用命令選項:
-i:忽略字母大小寫
-v:條件取反
-c:統計匹配次數
-q:靜默,無任何輸出(看$?返回值,為0則匹配)
-n:顯示出匹配結果所在的行號
--color:標紅顯示匹配字串
基本正則
行首及單字匹配
類型 含義 示例 說明
^ 匹配行首 ^abc 匹配以abc開始的行
$ 匹配行尾 abc$ 匹配以abc結尾的行
. 單個字符 . 匹配任意字符,(\n換行符除外)
+ 最多匹配一次 a+或者(abc)+ 一個或多個連續的a
* 匹配任意次數 .* 任意長度的任意字符
{} 限定匹配次數 \{n},{\n,m\},{n,} 匹配n次,匹配n-m次,至少匹配n次
[] 集合內的任何字符 [a-z] 匹配任意小寫字母
[^..] 中闊號內加^ [^123] 過濾123
\(xx\) 保留 \(abc\)x\2 保留abc
實例:
在a.txt文件中
匹配a出現的次數
[root@ceshiji ~]# grep "a*" a.txt
aaaa
bbasads
caascaiof
assacafca
asocnoaf
過濾有oo的字節
[root@ceshiji ~]# grep "oo" a.txt
過濾不想要oo前面有g的
[root@ceshiji ~]# grep "[^g]oo" a.txt
過濾oo前面不想有小寫字母
[root@ceshiji ~]# grep "[^a-z]oo" a.txt
過濾有數字的一行
[root@ceshiji ~]# grep "[^0-9]" a.txt
過濾兩個o以上的字節
[root@ceshiji ~]# grep "o\{2,\}" a.txt
擴展正則(增強,優化)
egrep
類型 含義 示例 說明
() 組合為整體 ab{1,3} 匹配ab
? 最多匹配一次 a?或者(abc)? 0個或a,0個或1個abc
+ 最少匹配一次 a+或者(abc)+ 一個或多個連續的a,一個或多個連續的abc
——————————————————————————————————————————————————————
