day27:expect批量執行命令|打包挪日記|文本處理|批量刪除日記|房貸計算器

一、在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
相關文章
相關標籤/搜索