使用远程服务器上的函数执行awk脚本

时间:2016-08-04 20:16:02

标签: bash awk

我有一个awk脚本,其中包含如下函数:

for file in logfile.log; 
do 
    echo "File Name- "$file; 
    grep -v "Some Text" $file | awk -F [:\ ] '{sub(/T/, " "); if($8~500) CNT[$1":"$2]++} END {for (c in CNT) print c, "--", CNT[c]}' | sort; 
    echo "==============Done with $file=================="; 
done

但我想在许多删除服务器上执行此脚本,所以我只是登录到我们的部署(基本上可以访问我想要执行的所有服务器)并且我收到很多编译错误,我使用以下内容代码:

for server in 01 02 03 04; do 
ssh web_user@webserver$server '
hostname -f;
cd /logs/dir/path;
for file in log-file-name.log; 
do 
    echo "File Name- "$file; 
    grep -v "Some Text" $file | awk -F [:\ ] '{sub(/T/, " "); if($8~500) CNT[$1":"$2]++} END {for (c in CNT) print c, "--", CNT[c]}' | sort; 
    echo "==============Done with $file=================="; 
done
'  2>&1 | grep -v 'THIS SYSTEM IS RESTRICTED'; done

有人可以帮我这个吗?我的问题是虽然这个脚本有任何编译错误,但我收到很多编译错误。

提前谢谢!!

1 个答案:

答案 0 :(得分:1)

bash中,单引号(')会转义除了其他单引号之外的所有后续字符。因此,OP中{sub...之类的内容将由您的本地脚本解释。

要将脚本以这种方式传递到远程bash(由ssh打开的那个),您需要:

  • 将整个脚本用单引号括起来。

  • '替换脚本中的每个引用'\''(不是外部的!)。这是如何工作的:第一个'结束了当前的报价; \'包含引用的单撇号;最后'重新打开报价单。

示例脚本:

foo=bar
echo 'foo=$foo'
echo "foo=$foo"

预期产出:

foo=$foo
foo=bar

“手动”调用示例,即这是您在终端中输入的内容:

ssh server '
foo=bar
echo '\''foo=$foo'\''
echo "foo=$foo"
'

但是,有一种方法可以避免所有这些引用业务:您可以将原始脚本(使用普通单引号)保存在文件myscript中,然后运行:

ssh server "$(cat myscript)"

这样,本地bash将不再被myscript中出现的单引号混淆,因为整个内容都会被引用。