前文:
Shell腳本可提高工作執行效率,本質上爲一堆命令的集合。
一、字符串處理
#部分代碼案例展示
log_index=$(cat $log_txt) #最新記錄
#echo $log_index
log_path=$(echo $log_index | awk '{print $4}') #數據文件
#echo $log_path
log_datas=$(echo $log_path | sed "s/20.*-[0-9]*-[0-9]*\/.*/$(date +%Y-%m-%d)\//g" | sed "s/20[0-9]*\/.*/$(date +%Y%m%d)\//g") #替換時間後當天的所有數據文件
#echo $log_datas
log_last=$(ls -lrt $log_datas | grep message | sed -n '$p' | awk '{print $9}') #取最新的數據文件名
#echo $log_last
log_message=$(wc -l $log_datas$log_last) #行數+最新數據文件的絕對路徑
#echo $log_message
log_file=$(echo $log_message | awk '{print $2}' | sed 's/.*log.//g' | sed 's/\./_/g') #第幾個文件(往回寫的參數)
#echo $log_file
log_num=$(echo $log_message | awk '{print $1}') #行數
#echo $log_num
log_filepath=$(echo $log_message | awk '{print $2}') #文件路徑
#echo $log_filepath
echo $log_file", "$log_num" = "$log_filepath > $binDir"/"$log_txt #更新文件
二、 使用rsync命令遠程同步多臺服務器文件——xsync
#!/bin/bash
#1 獲取輸入參數個數,如果沒有參數,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 獲取文件名稱
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 獲取上級目錄到絕對路徑
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 獲取當前用戶名稱
user=`whoami`
#5 循環
for((host=2; host<3; host++)); do
echo ------------------- hadoop0$host --------------
#rsync -rvl /opt/module root@hadoop02:/opt/
rsync -rvl $pdir/$fname $user@hadoop0$host:$pdir
done
三、腳本啓動Zookeeper——zk.sh
#! /bin/bash
case $1 in
"start"){
for i in hadoop102 hadoop103 hadoop104
do
ssh $i "/opt/module/zookeeper-3.4.10/bin/zkServer.sh start"
done
};;
"stop"){
for i in hadoop102 hadoop103 hadoop104
do
ssh $i "/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop"
done
};;
"status"){
for i in hadoop102 hadoop103 hadoop104
do
ssh $i "/opt/module/zookeeper-3.4.10/bin/zkServer.sh status"
done
};;
esac
四、自動重啓Maxwell
vim /home/cesar/listen_maxwell-1.24.0.sh
#/bin/bash
source /etc/profile
#監聽對應maxwell的路徑
maxwell_path="/opt/maxwell-1.24.0"
rusult=`ps -efv | grep maxwell |grep -v grep |grep 'listen_maxwell-1.24.0.sh' | wc -l` #監聽此腳本是否啓動,編輯此腳本時也被識別爲啓動
#手動執行:maxwell宕機:啓動腳本+判斷腳本=2,maxwell正常:啓動腳本+判斷腳本+已存在進程=3 ;
#定時器執行:maxwell宕機:0,maxwell正常:已存在進程=1 ;
if [ "$rusult" = "0" ];then
cd $maxwell_path && nohup ./bin/maxwell &
echo " `date "+%Y-%m-%d %H:%M:%S"` $i 啓動成功!" >> /home/cesar/listen_maxwell_log
fi
五、常用
1、使用Sed (取第幾行、增刪、替換)
cat number.txt | sed 's/ /\n/g '|grep -v "^$"|sort -nr|sed -n '1p;$p' 對文件獲取最大數和最小數值
sed '/匹配數據/a 添加數據' test.txt 增加後一行
sed '/匹配數據/i 添加數據教' test.txt 增加前一行
sed '/匹配數據/d' test.txt 刪除該行
sed '2d' test.txt 刪除第四行
sed -n '2p' text.txt 打印第二行
sed '4s/舊字符串/新字符串/g' text.txt 替換第四行的舊字符串
2、使用AWK(取行、分割、取列)
ifconfig |grep -E '([1-9]{1,3}\.){3}[1-9]{1,3}' |awk -F : '{print $2}'|awk -F " " '{print $1}' 獲取IP地址
ifconfig |grep Bcast |awk '{print $2}'|sed 's/addr://g' 獲取IP地址
echo "1 2 3"|awk '{print "third:"$NF}' 打印最後一列並在前面添加字符串
awk 'NR>=10{print $1}' canshu.sh 打印大於10行的第一列(增加過濾條件)
awk -F ":" '{print $1 "\t" $3}' 截取以:爲分隔符的第一列和第三列
3、使用Cut(指定切割取列)
echo $PATH | cut -d ':' -f 1-3,5 按:分割,取出1,2,3,5列
4、使用Grep(捕獲,正則匹配)
cat test.txt |grep -E "([1-9]{1,3}\.){1,3}[1-9]{1,3}" 匹配IP地址
5、使用find(查找文件)
find . -maxdepth 1 -size +50M -type f -name "*.txt" -mtime -1 -exec mv {} /tmp/ \ 只找一層節點大於50M類型爲文件名字爲.txt創建時間爲當天,移動到/tmp文件目錄
六、綜合所有腳本
#!/bin/bash
function fun1(){
j=0
for ((i=1;i<=100;i++))
do
j=`expr $i + $j`
done
echo $j
}
function fun2(){
i=0
j=0
while [[ $i -lt 10 ]]
do
if (( $i %2 == 0 ));then
j=`expr $i + $j`
elif [[ $i -eq 3 ]];then
echo "Hello! 3!"
else
echo "no double or 3"
fi
((i++))
done
echo "j=$j"
}
function fun3(){
read -p "Input your passwd:" num
if [[ $num -eq "000000" ]];then
echo "Success!"
else
echo "Bad!"
fi
}
PS3="Select one your like:"
select i in "fun1" "fun2" "input" "exit"
do
case $i in
fun1)
fun1
;;
fun2)
fun2
;;
input)
fun3
;;
exit)
echo "ByeBye!"
exit
;;
*)
echo "Usage:{ $0 1|2|3|4 }"
;;
esac
done