awk引用外部变量及调用系统命令方法

目标:想用awk与scp命令批量传送文件

前提:先搭好主机间的免密登陆环境(参考:http://www.cnblogs.com/tankaixiong/p/4172942.html)

实现脚本方法:

1.在一个文件中记录好各个主机的端口与ip地址,第一列为主机描述信息,参考信息

[root@zejin240 share]# cat scp_port_ip.txt 
host1 33330 192.168.10.11
host2 33331 192.168.20.22
host3 33332 192.168.30.33
host4 33333 192.168.40.44

2.编写shell脚本

[root@zejin240 share]# cat scp_all.sh 
#!/bin/bash
src_path='/home/chenzejin/mysql_backup_all.sh'
des_path='/home/chenzejin/mysql_backup_all_from11.sh'
awk '{ cmd="scp -P"$2 "'" $src_path"'"  " chenzejin@"$3":""'"$des_path"'";print cmd  }   ' /mnt/hgfs/share/scp_port_ip.txt

说明:最后一行用awk去调用主机ip与端口的信息,并拼接成一个完事的scp命令,这个脚本中只是打印拼接命令,确定拼接命令正确用,将print cmd改成system(cmd)即可完成真正命令的执行

调试信息如下:

[root@zejin240 share]# sh -x scp_all.sh 
+ src_path=/home/chenzejin/mysql_backup_all.sh
+ des_path=/home/chenzejin/mysql_backup_all_from11.sh
+ awk '{ cmd="scp -P"$2 " /home/chenzejin/mysql_backup_all.sh"  " chenzejin@"$3":""/home/chenzejin/mysql_backup_all_from11.sh";print cmd  }   ' /mnt/hgfs/share/scp_port_ip.txt
scp -P33330 /home/chenzejin/mysql_backup_all.sh chenzejin@192.168.10.11:/home/chenzejin/mysql_backup_all_from11.sh
scp -P33331 /home/chenzejin/mysql_backup_all.sh chenzejin@192.168.20.22:/home/chenzejin/mysql_backup_all_from11.sh
scp -P33332 /home/chenzejin/mysql_backup_all.sh chenzejin@192.168.30.33:/home/chenzejin/mysql_backup_all_from11.sh
scp -P33333 /home/chenzejin/mysql_backup_all.sh chenzejin@192.168.40.44:/home/chenzejin/mysql_backup_all_from11.sh

说明:在使用awk命令引用外部变量时,需要注意:外部变量名需要用"'"$src_path"'"这样的格式来引用,而awk中的域信息$0 $1 $2……等不用任何引号包含。

为什么需要用"'"$src_path"'"这样的格式来引用外部变量呢,其实shell在解析时是从左到匹配单引号与双引号的,会一步步解释过去,具体的可以参考其它的文章:http://www.cnblogs.com/mydomain/archive/2012/09/24/2699467.html

至此,完成了我们的设定目标。

原文地址:https://www.cnblogs.com/zejin2008/p/5144647.html