我有一个运行远程awk命令的bash脚本,但我想我还没有正确转义特殊字符,因为远程服务器上没有生成文件。我仍然没有错误。
我的变量在本地声明,可以远程使用而不会出现问题(脚本的其他部分确认了这一点)。
ssh -q -t server '
logfiles=$(find /var/log/httpd/ -type f -name *access_log -cmin -'"$past"')
for log in $logfiles;
awk -vDate=\`date -d'now-'"$past"' minutes' +[%d/%b/%Y:%H:%M:%S\` ' { if \(\$4 > Date\) print \$0}' $log | sort |uniq -c |sort -n | tail | cut -d " " -f 11,15,16
done
'
谢谢!
传递此脚本
#!/bin/bsh
logfiles=$(find /var/log/httpd/ -type f -name *access_log -cmin -120)
for log in $logfiles; do
awk -vDate=`date -d'now-120 minutes' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print $0}' $log | sort |uniq -c |sort -n | tail | cut -d " " -f 11,15,16 > /root/httpd.log;
done
像这样工作
ssh user @ host< script.sh
当我从控制台运行相同的脚本时:
ssh -q -t $apache '
logfiles=$(find /var/log/httpd/ -type f -name *access_log -cmin -120)
for log in $logfiles; do
awk -vDate=`date -d'now-120 minutes' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print $0}' $log | sort |uniq -c |sort -n | tail | cut -d " " -f 11,15,16 > /root/httpd.log;
done'
-bash: syntax error near unexpected token `('
所以我试图逃避括号
ssh -q -t $apache '
logfiles=$(find /var/log/httpd/ -type f -name *access_log -cmin -120)
for log in $logfiles; do
awk -vDate=`date -d'now-120 minutes' +[%d/%b/%Y:%H:%M:%S` ' { if \($4 > Date\) print $0}' /var/log/httpd/royalcanin_com.access_log | sort |uniq -c |sort -n | tail | cut -d " " -f 11,15,16 > /root/httpd.log;
done'
但是没有生成任何东西。
在服务器上生成文件但是空了:
awk -vDate=\`date -d'now-120 minutes' +[%d/%b/%Y:%H:%M:%S\` ' { if '"($4 > Date)"' print $0}' $log | sort |uniq -c |sort -n | tail | cut -d " " -f 11,15,16 > /root/httpd.log;done'
答案 0 :(得分:1)
您还需要转义单引号。例如,第一个脚本......
ssh -q -t server '
logfiles=$(find /var/log/httpd/ -type f -name *access_log -cmin -'"$past"')
for log in $logfiles;
awk -vDate=\`date -d'now-'"$past"' minutes' +[%d/%b/%Y:%H:%M:%S\` ' { if \(\$4 > Date\) print \$0}' $log | sort |uniq -c |sort -n | tail | cut -d " " -f 11,15,16
done
'
......必须真正写成:
ssh -q -t server '
logfiles=$(find /var/log/httpd/ -type f -name *access_log -cmin -'\''"$past"'\'')
for log in $logfiles;
awk -vDate=\`date -d'\''now-'\''"$past"'\'' minutes'\'' +[%d/%b/%Y:%H:%M:%S\` '\'' { if \(\$4 > Date\) print \$0}'\'' $log | sort |uniq -c |sort -n | tail | cut -d " " -f 11,15,16
done
'