Shell腳本的使用(積累ing)

前文:

          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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章