-1

input.dump ファイルを受け取り、tshark で分析する Unix コマンドがあります。その分析は、ソースと宛先の情報について grep によってフィルタリングされ、次に、VMware について grep によって再度フィルタリングされます。最終的な出力は、後で処理するために 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

推測によると、シェル コマンド ラインで実行するコマンドは次のとおりです。

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

これは、「sort-merge」ブランチの SO 質問ディレクトリの現在の正しい出力です。

同様のテストを試すことはできますか?シェル ( ) は何に$SHELL設定されていますか?

コマンドを段階的に構築できますか?

  1. tshark -r input.dump -V > input.raw' ' viaを実行してsystem、結果を確認してください。
  2. 'tshark -r input.dump -V | egrep "Source:|Destination:" > input.parboiledを実行して、結果を確認してください。
  3. ' ' を実行cat input.parboiled | grep -v "Vmware" > input.semiusefulして、結果を確認してください。

などなど、何かがゲームを放棄する必要があります。極端な場合はset -x;、コマンドの前に追加して、シェルが実行していると見なすものを確認してください。

于 2013-09-22T03:49:47.930 に答える