Linux Shell 小腳本經典收藏

轉載:https://www.cnblogs.com/Javame/p/3867686.html

建立信任關係:

## ====================================================##
## auth:wonter                                         ##
## date:2014-06-12                                     ##
## to  :trust.sh                                       ##
## ====================================================##
#!/bin/sh
trust(){
{
echo -e "\n"
} | ssh-keygen -t rsa -P ''

#參數
echo "請輸入信任機ip:(提示:需輸入三次密碼!)"
read ip

#建立信任關係
cd ~/.ssh

scp -r id_rsa.pub $ip:/root/.ssh/$ip

ssh $ip 'touch ~/.ssh/authorized_keys && chmod 644 ~/.ssh/authorized_keys'

ssh $ip "cat ~/.ssh/$ip >> ~/.ssh/authorized_keys"
}
trust
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #更新時間

echo 3 > /proc/sys/vm/drop_caches #清理緩存

python -m SimpleHTTPServer #啓動python頁面cgi訪問

jenkins項目發佈

(1)預安裝:

yum instal sshpass -y

(2)jenkins項目發佈腳本:

ip="192.168.20.200"
jenkinsurl="http://ip:port/job/portal"
port="22"
passwd="123456"
tomcatpath="/root/tomcat-8.0"
war_name="web-portal"
get_war="${jenkinsurl}/ws/target/${war_name}.war"

pid=`sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "ps -ef | grep $tomcatpath | grep -v grep | awk '{print \$2}'"`
if [ "X${pid}" = "X" ]
then
sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "rm -rf $tomcatpath/webapps/*"
sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "curl $get_war -o $tomcatpath/webapps/${war_name}.war"
sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "unzip $tomcatpath/webapps/${war_name}.war -d $tomcatpath/webapps/ROOT"
sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "rm -rf $tomcatpath/webapps/${war_name}.war"
sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "rm -rf $tomcatpath/webapps/ROOT/WEB-INF/classes/properties/*"
sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "$tomcatpath/bin/startup.sh" 
else 
sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "kill -9 \$(ps -ef | grep $tomcatpath | grep -v grep | awk '{print \$2}')"
sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "rm -rf $tomcatpath/webapps/*"
sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "curl $get_war -o $tomcatpath/webapps/${war_name}.war"
sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "unzip $tomcatpath/webapps/${war_name}.war -d $tomcatpath/webapps/ROOT"
sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "rm -rf $tomcatpath/webapps/${war_name}.war"
sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "rm -rf $tomcatpath/webapps/ROOT/WEB-INF/classes/properties/*"
sshpass -p $passwd ssh $ip -p ${port} -o StrictHostKeychecking=no "$tomcatpath/bin/startup.sh"
fi

刪除空行、 刪除第四行和第二行、刪除第三行到尾行

sed -e '/^$/d'

sed -e '4d' -e '2d'

sed -e '3,$d' (sed '/info/,$d') #匹配

輸出模式匹配1和模式匹配行2 
$sed -n -e '/Storage/p' -e /Software/p thegeekstuff.txt 
5. Storage 
9. Software Development 

清除linux緩存

 echo 3 > /proc/sys/vm/drop_caches

1、在兩個文件中找出相同的號碼

diff -y xx.txt oo.txt | egrep -v "<|>" | awk '{print $2}'

2、打印第幾行到第幾行之間

cat 1 | awk 'NR==2,NR==4{print}'
cat -n rsyslog.conf              //顯示所有行號(包括空行)
cat -b rsyslog.conf              //顯示所有行號(但不包括空行)
nl -ba rsyslog.conf              //顯示所有行號(包括空行)

nl -bt rsyslog.conf              //顯示所有行號(但不包括空行)
less -N rsyslog.conf             //顯示所有行號(包括空行)
1、刪除Linux遠程用戶連接會話
[root@tradx24 logs]# w
 10:45:28 up 15 days, 16:23,  4 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1     -                Sun21    4days  0.00s  0.00s -bash
root     pts/0    192.168.1.2    09:11    0.00s  0.07s  0.00s w
root     pts/2    192.168.1.2    09:45   30:53   0.07s  0.07s -bash
root     pts/3    192.168.1.8    10:20   22:05   0.02s  0.00s vi operation.log
[root@tradx24 logs]# skill -KILL -v pts/3
pts/3    root     21217 vi              
pts/3    root     24331 bash
2、通過ssh遠程執行命令
[root@tradx24 bin]# iip="192.168.1.10"
[root@tradx24 bin]# ssh $iip w
 10:54:13 up 125 days, 20:17,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1     -                21Mar14  4days  0.09s  0.09s -bash
3、通過ssh遠程批量執行MySQL腳本
#ip
list1=(`cat ../tools/dblist | grep -v \# | awk '{print $1}' | sed "1,1d"`)
#user
list2=(`cat ../tools/dblist | grep -v \# | awk '{print $2}' | sed "1,1d"`)
#password
list3=(`cat ../tools/dblist | grep -v \# | awk '{print $3}' | sed "1,1d"`)
for((i=0;i<=${#list1[@]};i++));
do
        iip=`echo ${list1[i]} | awk -F "." '{print $4}'`
        ssh ${list1[i]}  mkdir /home/sqlScrip/
        ssh ${list1[i]}  mkdir /home/sqlScrip/$iip
        clear
        scp ../sqlScrip/$iip/* ${list1[i]}:/home/sqlScrip/$iip
        clear
        #path
        list4=(`ls ../sqlScrip/$iip`)

        for((w=0;w<=${#list4[@]};w++));
        do
                if [ "117" == "$iip" ]
                then
                        ssh ${list1[i]}  "mysql -h ${list1[i]} -u ${list2[i]} -p${list3[i]} < /home/sqlScrip/${iip}/${list4[w]};"
                        clear
                fi
        done
        ssh ${list1[i]} 'rm -rf /home/sqlScrip'
done

4、從SV下載war包

#list第五行爲下載地址
list=(`cat ../tools/list  | awk '{print $5}' | sed "1,1d"`)
for((i=0;i<${#list[@]};i++));
do
        curl -u wangyong:Abcd1234 -O ${list[i]}

        war=`echo ${list[i]} | awk -F "/" '{print $NF}'`
        mv $war ../workapp/
done

5、解壓war包到指定目錄

ssh ${ip} unzip ${tomcat目錄}/webapps/${war包名稱}.war -d  ${tomcat目錄}/webapps/${指定目錄}

6、多Linux服務器建立信任關係

ssh-keygen -t rsa
cd ~/.ssh
scp -r id_rsa.pub $ip:/root/.ssh/$ip
ssh $ip 'touch ~/.ssh/authorized_keys && chmod 644 ~/.ssh/authorized_keys'
ssh $ip "cat ~/.ssh/$ip >> ~/.ssh/authorized_keys"

7、刪除某目錄下空文件

find ../new/$serve/properties -type f -size 0 -exec rm -f {} \;

8、刪除某目錄下小於10b的文件

9、Linux通過alias設置快捷命令

複製代碼
command(){
list1=(`cat ~/.bashrc | grep custom`)
for((i=0;i<=${#list1[@]};i++));
do
        if [[ "${list1[i]}" = "#custom" ]]
        then
                echo "[warn] The command has already been initialized,there's no need to repeat the operation, thank you!"
                break
        else
                path=`pwd`
                #初始命令
                #Initialization commands.
                echo "#custom" >> ~/.bashrc
                echo "alias l='ll -al'" >> ~/.bashrc
                echo "alias conf='cd `echo $path`/../conf'" >> ~/.bashrc
                echo "alias bin='cd `echo $path`/../bin'" >> ~/.bashrc
                echo "alias new='cd `echo $path`/../new'" >> ~/.bashrc
                echo "alias too='cd `echo $path`/../tools'" >> ~/.bashrc
                echo "alias hostlist='cat `echo $path`/../tools/.hostlist'" >> ~/.bashrc
                echo "alias un='cd `echo $path`/../'" >> ~/.bashrc
                echo "alias bak='cd `echo $path`/../bak'" >> ~/.bashrc
                echo "alias app='cd `echo $path`/../workapp'" >> ~/.bashrc
                echo "alias ..='cd ../'" >> ~/.bashrc
                source ~/.bashrc
        fi
done
}
複製代碼

10、引用其他shell腳本方法

複製代碼
## ====================================================##
## auth:wonter                                         ##
## date:2014-06-12                                     ##
## path:javame.cnblogs.com                             ##
## ====================================================##
#!/bin/sh
#引用tool.sh腳本中方法
. ../tools/tool.sh
#Parameters
par
#Capture ip
#Capture path
config
複製代碼

11、獲取腳本自身名稱

#Automatically obtain configuration files
name=`echo $0`
uname=`echo $name | awk -F "/" '{print $2}' | awk -F "." '{print $1}'`
#Uniform configuration
serve="$uname"

12、檢查是否存在文件夾,沒有則新建文件夾

複製代碼
bak_mk="../bak/$serve"
new_mk="../new/$serve"
if [ ! -d $bak_mk ]; then
mkdir $bak_mk
fi
if [ ! -d $new_mk ]; then
mkdir $new_mk
fi
判斷文件是否爲空
if [[ -s $file ]]; then
    echo "not empty"
  fi
複製代碼

13、統計腳本執行時間

複製代碼
     st=`date +"%Y-%m-%d %H:%M:%S"`
   #執行方法
start en=`date +"%Y-%m-%d %H:%M:%S"` st_c=`date -d "$st" +%s` en_c=`date -d "$en" +%s` interval=`expr $en_c - $st_c` echo "Start start-up time :${st}" echo "Start end time :${en}" echo "total consuming time :${interval} 秒"
複製代碼

14、shell定義集合

複製代碼
#name
list1=(`cat ../tools/list | grep -v \# | awk '{print $1}' | sed "1,1d"`)
#ip
list2=(`cat ../tools/list | grep -v \# | awk '{print $2}' | sed "1,1d"`)
#serve
list3=(`cat ../tools/list | grep -v \# | awk '{print $3}' | sed "1,1d"`)
for((i=0;i<=${#list1[@]};i++));
do
        cp ../conf/.model ../conf/${list1[i]}.conf
        cp ../bin/.model.wy ../bin/${list1[i]}.wy
        cp ../bin/.model.yw ../bin/${list1[i]}.yw
done
複製代碼

15、記錄腳本執行者用戶與IP

#Perform operation
echo "operator:"
read me
a=`tty | awk -F "/dev/" '{print $2}'`
date "+%Y-%m-%d %H:%M:%S" >> ../logs/operation.log
echo `w | grep $a | awk '{print $3}'` "${me} > Perform operation: one" >> ../logs/operation.log

16、shell中的正則語句

複製代碼
for i in `cat ../conf/$confs  | grep start | awk -F ">>" '{print $2}' | awk -F "_" '{print $1}'`
do
        if [[ "${i}" == "shiro" ]]
        then
                sed -n -e '/>>shiro/,/>>shiro/p'  $confs |grep -v '>>shiro' > $pro_shi
                cat $pro_shi | col -b > ../temp/m1
                cat ../temp/m1 > $pro_shi
        elif [[ "${i}" == "jdbc" ]]
        then
                sed -n -e '/>>jdbc/,/>>jdbc/p'  $confs |grep -v '>>jdbc' > $pro_jdbc
                cat $pro_jdbc | col -b > ../temp/m1
                cat ../temp/m1 > $pro_jdbc
        fi
done
複製代碼

17、shell寫個定時進程(不推薦我這個寫法,應該有更好!)

複製代碼
## ====================================================##
## auth:wonter                                         ##
## date:2014-06-12                                     ##
## to  :timing.sh                                      ##
## ====================================================##
#!/bin/sh
echo "請輸入定時閥值(格式:`date +"%Y-%m-%d %H:%M"` )"
        read timing
echo "定時任務設置完畢,請安心等待..."
ti(){
while true
do
        time=`date +"%Y-%m-%d %H:%M"`

        if [[ "${time}" == "${timing}" ]]
        then
                echo "定時任務:"
                #定時清理日誌
                rm -rf ../logs/*
                #定時備份日誌
                #定時執行腳本
                break
        fi
done
}
ti&
複製代碼

18、通過參數方式執行腳本 tools.sh

複製代碼
#!/bin/sh
trust(){
#建立信任
echo "請輸入信任機ip:(提示:需輸入三次密碼!)"
read ip
trusts
}
command(){
#初始化命令
command
}
case "$*" in
        trust)
        trust
        ;;
        command)
        command
        ;;
        *)
        echo "----------------------------------------"
        echo "pls : http://javame.cnblogs.com  welcome"
        echo "----------------------------------------"
        echo "  主機信任     | or | 初始化命令(初始)  "
        echo "tools.sh trust | or | tools.sh command"
        echo "----------------------------------------"
        ;;
esac
複製代碼

19、終端發送回會話給其他用戶 限root用戶

echo "輸入您想說的話吧:"
read spk echo $spk
>/dev/stdin >/dev/pts/2

20、某目錄下所有文件統一批量修改ip

sed -i  "s/10.0.0.1/10.0.1.2/g" `grep "10.0.0.1" -rl /opt/uer/wy`

21、鏈接數與進程數

複製代碼
#鏈接數
netstat -n | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'
#統計httpd協議連接數進程數
ps -ef|grep httpd|wc -l
ps aux|grep httpd|wc -l
#句柄數
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more 
#查看進程佔用內存
ps aux |awk '($1 ~apache) && ($6>50) {print $0}'
複製代碼

22、Linux查看線程的三種方法

複製代碼
1、top -H
手冊中說:-H : Threads toggle
加上這個選項啓動top,top一行顯示一個線程。否則,它一行顯示一個進程。
2、ps xH
手冊中說:H Show threads as if they were processes
這樣可以查看所有存在的線程。
3、ps -mp <PID>
手冊中說:m Show threads after processes
這樣可以查看一個進程起的線程數。
複製代碼

23、查看連接某服務端口最多的的IP地址

netstat -nat | grep "192.168.1.20:8443" |awk '{print $5}'|awk -F: '{print $4}'|sort|uniq -c|sort -nr|head -20

24、常見壓縮解壓命名

複製代碼
.tar 
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是壓縮!)

.gz
解壓1:gunzip FileName.gz
解壓2:gzip -d FileName.gz
壓縮:gzip FileName
.tar.gz 和 .tgz
解壓:tar zxvf FileName.tar.gz
壓縮:tar zcvf FileName.tar.gz DirName

.bz2
解壓1:bzip2 -d FileName.bz2
解壓2:bunzip2 FileName.bz2
壓縮: bzip2 -z FileName
.tar.bz2
解壓:tar jxvf FileName.tar.bz2
壓縮:tar jcvf FileName.tar.bz2 DirName

.bz
解壓1:bzip2 -d FileName.bz
解壓2:bunzip2 FileName.bz
壓縮:未知
.tar.bz
解壓:tar jxvf FileName.tar.bz
壓縮:未知

.Z
解壓:uncompress FileName.Z
壓縮:compress FileName
.tar.Z
解壓:tar Zxvf FileName.tar.Z
壓縮:tar Zcvf FileName.tar.Z DirName
.zip
解壓:unzip FileName.zip
壓縮:zip FileName.zip DirName

.rar
解壓:rar x FileName.rar
壓縮:rar a FileName.rar DirName 
複製代碼

25、厚積薄發,持續更新積累,請關注javame.cnblogs.com

1.gzexe -d 解密
2.Address 192.168.3.202 maps to bogon, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
解決方法:vim /etc/ssh/ssh_config 修改GSSAPIAuthentication 值爲 no
3.打印指定行一下

sed -n -i '/PID/,+600000000 p' file

4.sed用法

複製代碼
在第一行插入數據
sed -i 1"i\\$icare_ip" file
只打印第三行
sed -n '3p' datafile
只查看文件的第100行到第200行
sed -n '100,200p' file
刪除第二到第五行
sed '2,5d' datafile
刪除包含"2014-10-19"的行到包含"2014-10-29"的行之間的行
sed '/2014-10-19/,/2014-10-29/d' datafile
刪除包含"My"的行到第十行的內容
sed '/My/,10d' datafile
sed選項-e用於進行多重編輯
sed -e '1,10d' -e 's/My/Your/g' datafile
複製代碼

5.交互式輸入

{
echo "who"
} | ssh 192.168.48.73

6.shell中的集合

list1=(`cat ../tools/list | grep -v \# | awk '{print $1}' | sed "1,1d"`)
for((i=0;i<${#list1[@]};i++));
do
sh ./${list1[i]}.wy
done

7.判斷是否存在

if [ ! -d $bak_mk ]; then
mkdir $bak_mk
fi

8.針對^M

dos2unix

9.獲取最後登錄系統的ip

last -n 5

10.AWK統計某個文件夾下的文件佔用的字節數

ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
[end]size is 8657198
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}' 
[end]size is 8.25889 M

關於find搜索定位:

11.文件名 搜索文件

locate one.sh 

12.查找後執行

find ./ -name 192.168.48.154 -exec cat > 1 {} \;

13.刪除空文件

find ./ -type f -size 0 -exec rm -rf {} \;

14.查找大小爲0的文件或空目錄

find ./ -empty -type f / d 

15.查大於512k的文件

find /home -size +512k 

16.將多個文件打印到一個文件中

find ./ -name "[1-9].sh" -exec cat > 3 {} \;

17.目錄下過濾文件夾

find ./ ! -type f 

18.批量修改

find ./ -name "[1-9].sh" -exec sed -i s/0/9/g {} \;

19.-o 相當於且

find ./ -name "1.sh" -o -name "2.sh"

20.兩天內改動

find /home -mtime -2 

21.兩分鐘內改動

find /home -mmin -2

22.10分鐘內訪問的文件

find /home -amin -10

23.2小時內訪問的文件

find /home -atime -2

24.將find出來的東西拷到另一個地方

find *.c -exec cp '{}' /tmp ';'

 25.檢查/root目錄掛載在那個磁盤分區上

df -h /root

26.軟連接、硬鏈接

ln -s /home /root/home
ln -b /home/run.sh /root/run.sh

27.解壓到指定目錄

tar zxvf /filename.tar.zip -C /home

28.vi文書 

gg第一行G最後一行
d1G刪除光標所在行到第一行
dG刪除光標所在行到最後一行
yy複製光標所在一行
A在光標所在最後字符處開始插入
ZZ保存退出

29.^M 亂碼

yum install dos2unix

30.修改linux登錄後信息

vi /etc/motd

31.定時任務腳本

複製代碼
cmd="cd /root/polling/bin/ && /root/polling/bin/run.sh"
echo -n "* " >> /var/spool/cron/root
echo -n "6 " >> /var/spool/cron/root
echo -n "* " >> /var/spool/cron/root
echo -n "* " >> /var/spool/cron/root
echo -n "* " >> /var/spool/cron/root
echo $cmd >> /var/spool/cron/root
複製代碼

32.組網信任

複製代碼
{
echo -e "\n"
} | ssh-keygen -t rsa -P ''
cp -r ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
cd ~/.ssh
scp -r id_rsa.pub $ip:/root/.ssh/$ip
ssh $ip 'touch ~/.ssh/authorized_keys && chmod 644 ~/.ssh/authorized_keys'
ssh $ip "cat ~/.ssh/$ip >> ~/.ssh/authorized_keys"
複製代碼

33.關於shell入參處理

複製代碼
$0 腳本名字 
$1 位置參數 #1 
$2 - $9 位置參數 #2 - #9 
${10} 位置參數 #10 
$# 位置參數的個數 
"$*" 所有的位置參數(作爲單個字符串) * 
"$@" 所有的位置參數(每個都作爲獨立的字符串) 
${#*} 傳遞到腳本中的命令行參數的個數 
${#@} 傳遞到腳本中的命令行參數的個數 
$? 返回值 
$$ 腳本的進程ID(PID) 
$- 傳遞到腳本中的標誌(使用set) 
$_ 之前命令的最後一個參數 
$! 運行在後臺的最後一個作業的進程ID(PID)
複製代碼

34.使用cut切分

echo 1:2:3 | cut -d ':' -f 2
echo 1:2:3 | awk -F ':' {'print $2'}

 35.egrep擴展

cat 1.sh | grep -v 5 | grep -v 8
cat 1.sh | egrep -v '5|8'
ls | egrep 'lsit1.sh|tools.sh' #可以同時查找多個
egrep "go?d" tools.sh #?一個字符 * 多個字符

36.read命令帶描述

read -p "uname:" name

37.test命令

複製代碼
#判斷是否存在目錄/文件
test -e /home && echo ok || echo no
[ "a" == "ad" ] && echo yes || echo no
#判斷參數是否相等
test $a -eq $b && echo yes || echo no
test $a != $b && echo yes || echo no
-eq 相等
-ne 不相等
test "d" = "d" -o "a" = "d" && echo yes || echo no
-o 並
-a 且
複製代碼

38.進程樹

ps -axjf

 



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