命令在命令行中运行,但在Perl脚本中不运行

时间:2013-09-22 03:44:59

标签: perl unix

我有一个Unix命令,它接受一个input.dump文件并由tshark进行分析。然后通过grep过滤该分析以获取源和目标信息,然后再次通过grep过滤Vmware。最终输出放在一个名为input.useful的文件中,以便以后处理。

这是问题所在。当我通过命令行运行它时,它运行完美。对于我的任务,我必须编写一个运行该命令的Perl脚本。我尝试在脚本中使用间距,使用单引号或双引号,添加和删除文件路径等。当前代码只是收到错误:

grep: Vmware: no such file or directory.

帮助我理解为什么这可能在命令行中起作用,但在Perl中不起作用。我通过VMWare运行Ubuntu 13.04。

代码:

#!/usr/bin/perl

use strict;
use warnings;

#execute tshark command to extract data from dump file

system("tshark –r input.dump -V|egrep \"Source:|Destination:|Time since reference or first frame:|Source port:|Destination port:\"|grep –v \"Vmware\">input.useful");

2 个答案:

答案 0 :(得分:2)

通过推理,您在shell命令行运行的命令是:

tshark –r input.dump -V |
egrep "Source:|Destination:|Time since reference or first frame:|Source port:|Destination port:" |
grep –v "Vmware" >input.useful

在Perl中运行'same'命令的最简单方法是逐字包装,使用非常有用的qq{}表示法选择双引号作为"之外的其他内容。或者,实际上,将其包含在单引号中,甚至可能包括q{}

my $cmd = q{
tshark –r input.dump -V |
egrep "Source:|Destination:|Time since reference or first frame:|Source port:|Destination port:" |
grep –v "Vmware" >input.useful
};

现在您可以使用system

运行该功能
system $cmd;

  

我尝试了你的建议,我得到了与以前完全相同的错误。

很奇怪。我试过这个,这与你的例子接近同构:

#!/usr/bin/env perl
use strict;
use warnings;
my $cmd = q{
ls -l |
egrep "merge|sort" |
grep -v 'cpp$' > list.out
};

system $cmd;

它运行没有错误,生成list.out文件:

-rw-r--r--   1 jleffler  staff   2064 Sep 21 13:54 keysort1.c
-rw-r--r--   1 jleffler  staff   2602 Sep 21 13:54 keysort2.c
-rwxr-xr-x   1 jleffler  staff  14488 Sep 21 18:28 merge
-rw-r--r--   1 jleffler  staff   6274 Sep 21 13:54 merge.c
drwxr-xr-x   3 jleffler  staff    102 Sep 21 18:28 merge.dSYM
-rw-r--r--   1 jleffler  staff   8633 Sep 21 06:49 mergesort.c
-rwxr-xr-x   1 jleffler  staff  26232 Sep 21 18:01 mergesort2
drwxr-xr-x   3 jleffler  staff    102 Sep 21 18:01 mergesort2.dSYM
-rw-r--r--   1 jleffler  staff   3335 Sep 21 17:25 msort.c
-rw-r--r--   1 jleffler  staff  16134 Sep 21 06:49 sorttest.c

这是'sort-merge'分支上我SO问题目录的当前正确输出。

你能尝试类似的测试吗?你的shell($SHELL)设置为什么?

你能分阶段建立你的命令吗?

  1. 通过tshark -r input.dump -V > input.raw运行'system',看看你得到了什么。
  2. 运行'tshark -r input.dump -V | egrep "Source:|Destination:" > input.parboiled,看看你得到了什么。
  3. 运行“cat input.parboiled | grep -v "Vmware" > input.semiuseful”,看看你得到了什么。
  4. 等。有些东西应该让游戏消失。如果是extremis,请尝试在命令之前添加set -x;,以便查看shell认为它正在运行的内容。

答案 1 :(得分:2)

如果-vVmware之间存在非选项参数,例如以下XXX,则只会出现该错误:

$ grep -v XXX Vmware
grep: Vmware: No such file or directory

您没有发布实际运行的代码,或者您正在执行的grep不正常(例如,包含真实grep的别名。)