从SSH调用中使用awk抓取想要的'find'输出

时间:2014-10-07 14:22:16

标签: regex bash ssh awk

使用SSH通话,我需要运行“查找”功能。远程系统上的命令如下:

/usr/bin/find $mountpoint -type f -mtime +1095 -ls

(其中$ mountpoint是定义的路径)

然后我想获取输出的字段7(字节)

6668   56 -rw-r--r--   1 46978    32840       51652 Jun 24  1999   ./wafs2/BF_BRN_S1/Cta/updatesxp/OfficeSP1/FILES/WINDOWS/FONTS/ELEPHNT.TTF
6811   80 -rw-r--r--   1 46978    32840       76588 Oct 15  1999 ./wafs2/BF_BRN_S1/Cta/updatesxp/OfficeSP1/FILES/WINDOWS/FONTS/POORICH.TTF
6670   56 -rw-r--r--   1 46978    32840       54324 Jun 24  1999 ./wafs2/BF_BRN_S1/Cta/updatesxp/OfficeSP1/FILES/WINDOWS/FONTS/ELEPHNTI.TTF
6804   56 -rw-r--r--   1 46978    32840       55824 Jun 29  1999 ./wafs2/BF_BRN_S1/Cta/updatesxp/OfficeSP1/FILES/WINDOWS/FONTS/ROCC____.TTF

...并返回每行的总计数,如下所示:

/usr/bin/find $mountpoint -type f -mtime +1095 -ls | /bin/awk '{sum+=$7} END {print sum}'

并返回sum的值。

在远程主机上的本地bash会话中,这可以完美地工作并返回如下值: 1.61468e + 12

但是,当我尝试通过SSH运行相同的命令时,它不起作用:

$file_find_cmd = "/usr/bin/find $mountpoint -type f -mtime +1095 -ls | /bin/awk '\"{sum+=\$7} END {print sum}\"'"; 
print "here's \$file_find_cmd:$file_find_cmd\n"; 
$nas_find_cmd = "$ssh nasadmin\@$vnx -q '. /home/nasadmin/.set_nas_env_vars; $file_find_cmd'"; 
open($file_find_handle,'-|',"$nas_find_cmd") or die "Unable to run command $nas_find_cmd: $!\n";

我已经试图逃避$ 7中的$但是没有取得任何进展......所以我不认为这是。

帮助?感谢。

2 个答案:

答案 0 :(得分:0)

我仍然不确定你想要完成什么,但这是一个尝试:

#!/bin/sh
vnx=$1
mountpoint=$2
my_ssh="ssh -q $vnx /usr/bin/find $mountpoint -type f -mtime +1095 -ls | /usr/bin/awk '{sum+=\$7} END { print sum }'"
result=`$my_ssh`
echo Result is $result

./findremote.sh target_server /var输出形式为我工作:

Password:
Result is 226758

(它仍然要求输入密码,因为目标系统上没有任何authorized_keys)

此时,您在$result中希望获得此本地脚本中的后期处理值...

希望它能帮到你

编辑精度:当通过ssh启动命令时,不需要引用它们,主机之后的所有内容都将作为命令进行处理,因此对于您之前获取文件的特定示例,只需在此之前添加它: / p>

my_ssh="ssh -q $vnx . /home/nasadmin/.set_nas_env_vars; /usr/bin/find $mountpoint -type f -mtime +1095 -ls | /usr/bin/awk '{sum+=\$7} END { print sum }'"

如果您想进行额外测试并仅在采购有效时执行查找,请将;更改为&&

答案 1 :(得分:0)

我通过使用多个反斜杠转义所需列的占位符var来解决此问题;我缺乏awk和regexp的经验让我相信用一个反斜杠(即print \ $ 7)而不是三个(print \\ $ 7)来逃避它就足够了。

$nas_find_cmd = "$Ssh -q root\@$vnx \". /home/nasadmin/.set_nas_env_vars; /usr/bin/find $mountpoint -type f -mtime +1095 -ls | /bin/awk '{ sum=sum+= **\\\$7**} END { print sum }'\"";

我现在只有0.00042%更聪明。

全部谢谢!