一、在linux系統中/root/目錄下有一個文件ip-pwd.ini,內容以下:linux
192.168.149.131,root,nihao123!,shell
192.168.149.132,root,nihao123@bash
每一行的格式分別爲linux服務的IP 用戶 密碼,用一個shell腳本批量查看着看這些服務器的主機名;服務器
腳本代碼以下: 一個expect.sh腳本 一個exe.sh腳本,用來調用expect.shssh
[root@localhost_002 shell]# cat expect.sh #!/usr/bin/expect set port [lindex $argv 0] set host [lindex $argv 1] set passwd [lindex $argv 2] set cm [lindex $argv 3] spawn ssh -p $port root@$host expect { "yes/no" { send "yes\r";exp_continue} "password:" { send "$passwd\r" } } expect "]*" send "$cm\r" expect "]*" send "echo -n yuanhaohao >/tmp/yuanhh.txt\r" expect "]*" send "exit\r" [root@localhost_002 shell]# cat exe.sh #!/bin/bash cat ip-pwd.ini|while read line do ip=`echo $line |awk -F ',' '{print $1}'` pw=`echo $line |awk -F ',' '{print $3}'` po=`echo $line |awk -F ',' '{print $4}'` ./expect.sh $po $ip $pw "hostname" done 執行代碼: [root@localhost_002 shell]# sh exe.sh spawn ssh -p 52588 root@192.168.149.131 Last login: Sun Mar 10 12:14:56 2019 from 192.168.149.130 [root@localhost_03 ~]# hostname localhost_03 [root@localhost_03 ~]# echo -n yuanhaohao >/tmp/yuanhh.txt [root@localhost_03 ~]# spawn ssh -p 52588 root@192.168.149.132 Last login: Sun Mar 10 12:15:06 2019 from 192.168.149.130 [root@localhost_04 ~]# hostname localhost_04 [root@localhost_04 ~]# echo -n yuanhaohao >/tmp/yuanhh.txt [root@localhost_002 shell]#
註釋:固然 expect腳本能夠遠程批量執行命令(kaill掉某個服務,或者批量關機等),也能夠用分發代碼上線等;spa
2、一個腳本查找/data/log目錄下,建立時間是三天前後綴名是.log的文件,打包後發送至192.168.149.131服務器上的/data/log,並刪除源文件,只保留打包後的文件;code
分析:查找3天先後綴是.log的文件: find /data/log -type f -mtime +3 -name "*.log"排序
打包命令: tar zcvf ip
把打包後文件發送到遠程有兩個命令能夠使用; rsync scp (只須要作rsync驗證登陸或者ssh免密碼登陸就能夠拷貝遠程)rem
rsync 命令: rsync -avP -e "ssh -p 52588" expect.sh root@192.168.149.131:/data/log
[root@localhost_002 shell]# rsync -avP -e "ssh -p 52588" expect.sh root@192.168.149.131:/data/log/ sending incremental file list expect.sh 366 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1) sent 460 bytes received 35 bytes 990.00 bytes/sec total size is 366 speedup is 0.74
scp 命令: scp -P 52588 exe.sh root@192.168.149.131:/data/log/
[root@localhost_002 shell]# scp -P 52588 exe.sh root@192.168.149.131:/data/log/ exe.sh 100% 225 80.5KB/s 00:00
腳本命令以下:
[root@localhost_002 shell]# cat 77.sh #!/bin/bash cd /data/log find /data/log/ -type f -mtime +3 -name "*.log" > /tmp/old_log d=`date +%F` tar zcvf $d.tar.gz `cat /tmp/old_log|xargs` /usr/bin/rsync -avP -e "ssh -p 52588" $d.tar.gz root@192.168.149.131:/data/log/ #scp -P 52588 $d.tar.gz root@192.168.149.131:/data/log/ cat /tmp/old_log/|xargs rm -f 執行腳本: [root@localhost_002 shell]# sh 77.sh /data/log/anaconda.log /data/log/X.log /data/log/program.log /data/log/packaging.log /data/log/storage.log /data/log/ifcfg.log /data/log/ks-script-E_14kx.log /data/log/ks-script-ojsReP.log /data/log/journal.log sending incremental file list 2019-03-10.tar.gz 195,777 100% 61.79MB/s 0:00:00 (xfr#1, to-chk=0/1) sent 1,919 bytes received 1,715 bytes 7,268.00 bytes/sec total size is 195,777 speedup is 53.87
3、有以下文本:其中前5行內容以下:
1111111:13443253456 2222222:13211222122 1111111:13643543544 3333333:12341243123 2222222:12123123123
用 shell 腳本處理後,按下面的格式輸出:
[1111111] 13443253456 13643543544 [2222222] 13211222122 12123123123 [3333333] 12341243123
分析:本題的目的,是以第一段爲基準,列出第二段;
首先須要截取第一段的內容,排序及去重; 而後遍歷第一段的內容,用 awk 匹配來獲取第二段的相關內容;
for w in `awk -F ':' '{print $1}' 3.txt|sort -n|uniq ; do echo "[$w]" ; done`
[root@fenye2019 shell]# awk -F ':' '{print $1}' 3.txt|sort -n|uniq [root@fenye2019 shell]# for w in `awk -F ':' '{print $1}' 3.txt|sort -n|uniq`; do echo "[$w]"; done [1111111] [2222222] [3333333]
第一段的內容獲取到了,接下來和源文件 3.txt 匹配(awk實現),當匹配到 $1== w 時(w是上面的循環結果),則打印出 $2 出來;
不過此時涉及到一個傳參的問題,若是把shell的參數出傳遞到 awk 中; awk -v w2=$w -F ':' '$2==w2 {print $2}'
for w in `awk -F ':' '{print $1}' 3.txt|sort -n|uniq` ; do echo "$[w]"; awk -v w2=$w -F ':' '$1==w2 {print $2}' 3.txt ; done
[root@fenye2019 shell]# for w in `awk -F ':' '{print $1}' 3.txt|sort -n|uniq`; do echo "[$w]"; awk -v w2=$w -F ':' '$1==w2 {print $2}' 3.txt ; done [1111111] 13443253456 13643543544 [2222222] 13211222122 12123123123 [3333333] 12341243123
固然 awk 也能夠用以下這種方式來調用shell的參數 "' '" (裏面是單引號,外層是雙引號的方式)
awk -F ':' '$1=="'$w'" {print $2}' 3.txt
[root@fenye2019 shell]# for w in `awk -F ':' '{print $1}' 3.txt|sort -n|uniq`; do echo "[$w]"; awk -F ':' '$1=="'$w'" {print $2}' 3.txt ; done [1111111] 13443253456 13643543544 [2222222] 13211222122 12123123123 [3333333] 12341243123
腳本代碼以下:
[root@fenye2019 shell]# cat 78.sh #!/bin/bash for w in `awk -F ':' '{print $1}' 3.txt|sort -n|uniq` do echo [$w] awk -v w2=$w -F ':' '$1==w2 {print $2}' 3.txt done