awk remote ssh命令

时间:2014-11-26 10:31:02

标签: bash shell ssh awk

我有一个运行远程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
'

谢谢!


EDIT1:

传递此脚本

#!/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'

但是没有生成任何东西。


EDIT2:

在服务器上生成文件但是空了:

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'

1 个答案:

答案 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
'