我有一个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");
答案 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
)设置为什么?
你能分阶段建立你的命令吗?
tshark -r input.dump -V > input.raw
运行'system
',看看你得到了什么。tshark -r input.dump -V | egrep "Source:|Destination:" > input.parboiled
,看看你得到了什么。cat input.parboiled | grep -v "Vmware" > input.semiuseful
”,看看你得到了什么。等。有些东西应该让游戏消失。如果是extremis,请尝试在命令之前添加set -x;
,以便查看shell认为它正在运行的内容。
答案 1 :(得分:2)
如果-v
和Vmware
之间存在非选项参数,例如以下XXX
,则只会出现该错误:
$ grep -v XXX Vmware
grep: Vmware: No such file or directory
您没有发布实际运行的代码,或者您正在执行的grep
不正常(例如,包含真实grep
的别名。)