-1

我有一个 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");
4

2 回答 2

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 中运行“相同”命令的最简单方法是逐字包装,使用非常有用的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

这是“排序合并”分支上我的 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',看看你得到了什么。

等等。有些东西应该让游戏消失。如果出现极端情况,请尝试set -x;在命令之前添加,以便查看 shell 认为它正在运行的内容。

于 2013-09-22T03:49:47.930 回答
2

-v只有在and之间存在非选项参数时,您才会收到该错误,Vmware如下XXX所示:

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

要么您没有发布您实际运行的代码,要么grep您正在执行的代码不正常(例如,包装了 real 的 shall 别名grep)。

于 2013-09-22T04:29:43.357 回答