2013-09-22 76 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的別名)。

相關問題