我有一个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
有人可以帮我这个吗?我的问题是虽然这个脚本有任何编译错误,但我收到很多编译错误。
提前谢谢!!
答案 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
中出现的单引号混淆,因为整个内容都会被引用。