Shell腳本
腳本:可以執行文件,運行後可以實現某種功能(命令的堆積,非交互)
在Linux系統中腳本的解釋程序基本都在/bin/bash下面
在Linux系統中利用Bash的有點:可以使用快捷鍵、支持Tab鍵補齊、可以運用歷史命令、製作別名、支持標準輸入輸出、(在Shell腳本中經常使用重定向和管道操作)
重定向:
(1)重定向輸入 :<------------將(<)後面的內容導入到前面的文件中
(2) 重定向輸出 :>-------覆蓋重定向;>>---------追加重定向
>:只收集前面命令的正確輸出
2>:只收集前面命令的錯誤輸出
&>:收集前面命令的錯誤與正確輸出
Shell中的一些數值運算:expr 2 + 2、X=100 expr $X + 10
X=66 echo $[X+5]
for循環的結構
for 變量名 in 值列表
do
命令
done
While 判斷條件
do
命令
done
case 變量名 in
模式)
命令;;
模式)
命令;;
模式)
命令;;
*)
默認的命令;;
esac
子串截取的三種用法:
${x:起始位置:長度}
expr substr "$x" 起始位置 長度
echo $x | cut -b 起始位置-結束位置
字符串的替換
“/” 代表替換,vim中也是一樣“/“代表替換
echo ${變量//舊的內容/新的內容
舉列:x=1332551445
echo ${x//5/*}
echo ${x/335/***
變量“:” 截取,“/” 替換,“#" 掐頭,”%“,去尾
字符串掐頭去尾:
從左向右,最短匹配刪除:${變量名#*關鍵詞}
從左向右,最長匹配刪除:${變量名##*關鍵詞}
從右向左,最短匹配刪除:${變量名%關鍵詞*}
從右向左,最長匹配刪除:${變量名%%關鍵詞*}
x=`head -1 /etc/passwd`
root:x:0:0:root:/root:/bin/bash
echo ${x##:}
echo ${x##*:}
echo ${x%%:*}
遠程控制連接
i=192.168.4.207
expect << EOF
set timeout 300
spawn ssh $i
expect yes { send "yes\n"}
expect passwd { send "123456\n"}
expect # { send "touch /qq\n"}
expect # { sned "exit\n"}
EOF
(1)有時有yes提示,有時沒有,刪除known_hosts
(2)ssh比較慢,可以把ssh變快(修改配置文件),讓expect多等會
(3)expect最後一條命令不執行
在shell腳本中一步步顯示腳本的執行命令是:bash -x 腳本名字
seq 3----1、2、3
seq 2-6----2、3...6
echo -e -n "\033[33m \033[0m"-----“-e”代表擴展想要把這個顏色填充完整,“-n”表示不換行
3X------是字體顏色
4X------是背景顏色
X-------表示樣式
正則表達式:使用一些特殊的符號來表達
“^”---------------表示開始
“$”---------------結尾,行尾
“[ ]”--------------表示集合中任意符號
列如[a-e]=[abcde],[abcdemz123]=[ma-ez1-3]
[^]------------表示對集合取反
“.”-----------任意單個字符
“*”-----------匹配前一個字符出現了任意次(0次或多次)
“.*”----------匹配所有
\{n,m\}-------匹配前一個字符出現了n到m次
\{n,\}--------匹配前一個字符出現了n次或更多
\{n\}---------匹配前一個字符出現了n次
grep -n-------顯示行號
grep -i-------不去分大小寫
grep -c-------統計過濾出有幾行
grep -v-------表示取反
擴展正則:優化基本正則,添加新的
{n,m}、{n,}、{n}
“?”------0或1次
“+“------1或大於1次
“( )”------表示整體,列如:(abc){8}---------表示abc出現了8次
列如:
vim brace.txt
ab def ghi abdr
dedef abab ghighi
abcab CD-ROM
TARENA IT GROUP
cdcd ababab
Hello abababab World
[1]輸出ababab的行,即“ab”連續出現3次
egrep '(ab)'{3} brace.txt
[2]輸出ab,連續出現2~4次
egrep '(ab){2,4}' brace.txt
[3]輸出ab,至少連續出現3次
egrep '(ab){3,}' brace.txt
元字符[ ]-------匹配範圍內的單個字符
輸出包括abc、abd的行,即前兩個字符爲“ab”,第三個字符只要是c、d中的一個就符合條件:
egrep 'ab[cd]' brace.txt
輸出包括大寫字母的行,使用[A-Z]匹配連續範圍:
egrep '[A-Z]' brace.txt
輸出包括“非空格也非小寫字母”的其他字符的行,本例中大寫字母和 – 符合要求:
egrep '[^ a-zA-Z]' brace.txt
“|”--------表示或者關係,列如:(test|taste)
基本正則:兼容性強,使用麻煩
擴展正則:兼容性差,使用簡單,有些軟件不支持擴展正則
egrep---------支持擴展正則
\b------------表示單詞邊界
sed:文本編輯器,非交互(增、刪、改、查)
sed [選項] '條件指令' 文件
sed:逐行處理文件,流水處理
指令:p--打印
d--刪除
s--替換,s/舊的/新的/--------------注意:替換符號可以是任意其他符號
a--追加
i--插入
c--替換,整行替換
sed -n '|op' /etc/passwd-------(-n)屏蔽sed默認輸出功能
-r---支持擴展正則
sed使用的一些條件:(1):行號: sed -n '3p' /etc/passwd----把第三行打印出來
sed -n '3,5p' /etc/passwd---打印3、4、5行
(2):/正則/:sed -n '/root/p' /etc/passwd---把包含root的都打印出來
sed -n '/bash$/s#:.*##p' /etc/passwd-----把以bash結尾的行中的用戶找出來,s替換
awk -F: '/bash$/{print $1}' /etc/passwd
awk:數據過濾,統計處理(行,列),也是逐行處理
awk [選項] '條件{指令}' 文件
df | awk '/\/$/{print $4}'---------df:查看硬盤
free | awk '/Mem/{print $4}'------free:查看內存
選項:-F----指定分隔符(默認是空格或tab)
awk -F: '{print $1}' /etc/passwd
awk的一些內置變量:$1,$2,$3(表示某一列)、NF(當前行有多少列)、NR(當前行號)
awk打印常量(常量必須要使用引號)
列如:awk '{print "nh","root","nb"}' /etc/passwd
awk -F: '{print "用戶是:",$1}' /etc/passwd
awk的完整命令:
awk [選項] 'BEGIN{} 條件{ } END{}' 條件--------所有指令必須放在{ }
BEGIN{}:指令在讀取文件內容前執行1次
條件{ }:指令在讀取文件中執行n次
END{}:指令在讀取文件後執行1次
awk -F: 'BEDIN{print "用戶名" "UID" "解釋器"} {print $1,$2,$3} {print "總用戶量" NR}' /etc/passwd
awk的條件:
(1)正則(也可支持模糊匹配)
列如:一整行中包含root即可
awk -F: '/root/{print $3}' /etc/passwd
在一列中包含root即可
awk -F: '$1~/root/{print $3}' /etc/passwd
(2)數字和字符比較:==;!=;>;>=;<;<=
awk -F: '$3>=1000{print $1}' /etc/passwd
awk -F: '$1=="root"' /etc/passwd
(3)邏輯:&&;||
awk -F: '$3>10&&$<20' /etc/passwd
awk -F: '$3==0||$3==1000' /etc/passwd
(4)運算
awk 'BEGIN{x=5;y=5;print x+y}'
awk 'BEGIN{pirnt 2.5*5}'
awk 'BEGIN{x=5;print x+y}'
統計普通用戶有幾個,系統用戶幾個
awk -F: '{if($3<1000){x++}else{y++}} END{print x,y}' /etc/passwd
列子:
vim a.txt
root haha root
hehe root
ni hao ma root
awk '{i=1;while(i<=NF){if($i=="root"){x++};i++}}END{print x}' a.txt
sed -i '/192.168.4.5/d' ~/.ssh/known_hosts