2013-09-22 72 views
-1

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

这是问题所在。当我通过命令行运行它时,它完美运行。对于我的任务,我必须编写一个运行该命令的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

如果这就是你正在做的,为什么你需要在等式中使用Perl? – tripleee

+0

因为这是分配。 Perl脚本运行这个部分,然后获取输出并通过C程序运行,该程序对数据做了进一步处理。 – DarthLeia2

+0

但是,你可以只打开(处理,“tshark |”)'并在Perl中执行所有复杂的grepping操作,而不是写入文件。 – tripleee

回答

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 

这是当前正确的输出为我做题目录在'排序合并'分支上。

你可以尝试类似的测试吗?你的外壳($SHELL)设置为?

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

  1. 通过system运行 'tshark -r input.dump -V > input.raw',看看你会得到什么。
  2. 运行'tshark -r input.dump -V | egrep "Source:|Destination:" > input.parboiled并看看你得到了什么。
  3. 运行'cat input.parboiled | grep -v "Vmware" > input.semiuseful',看看你得到了什么。

等等东西应该把游戏带走。在极端情况下,请尝试在命令前添加set -x;,以便看到shell认为它正在运行的内容。

+0

我尝试了您的建议,并得到与以前完全相同的错误。我真的很想理解为什么当我看到的所有东西都说它应该这样时,这不起作用? – DarthLeia2

+0

我试过你的建议,一切都很完美。在此过程中,我原来的脚本开始工作。我希望我知道我做了什么来解决它。感谢您的时间。 – DarthLeia2

2

如果有-vVmware之间的非选项参数你只能得到这个错误,例如在以下的XXX

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

要么你没有张贴你居然跑的代码,或您正在执行的grep是不正常的(例如,应包含实际grep的别名)。

相关问题