2

find.txtパターン検索でファイルを作成する Perl スクリプトで 2 つのシェル コマンドを実行したいと考えています。以下は、正常に実行され、シェルから実行すると結果が得られるシェル スクリプトです。

cat "/home/atsuser/Users/srittamp/ns.conf" | grep "add\|set\|enable" | awk '{print $2}' > find.txt
grep -o '\w*' find.txt | sort | uniq > find.txt

しかし、systemperl のコマンドを使用して同じことを行うと、空白が表示されますfind.txt。以下は私のPerlスクリプトです:

#!/usr/bin/perl

use strict;
use warnings;

my $conf_file = "/home/atsuser/Users/srittamp/ns.conf";
my $find_file = "/home/atsuser/Users/srittamp/find.txt";


system("cat \"$conf_file\" | grep \"add\\|set\\|enable\" | awk '{print \$2}' > /home/atsuser/Users/srittamp/find.txt");
system("grep -o \'\\w*\' $find_file | sort | uniq > /home/atsuser/Users/srittamp/find.txt");

誰でもこれで私を助けてもらえますか?

4

5 に答える 5

2

システム コマンドで cat を無駄に使用していることや、 を定義しているという事実については触れ$find_fileませんが、コマンドで変数を使用する代わりにsystem、ファイル パスをハード コーディングしたり、sort | uniqあなたが使用できたときsort -u

私の質問は、すべてを簡単に実行でき、Perl で直接はるかに効率的に実行できるのに、なぜシステム コマンドに煩わされているのですか?:

use strict;
use warnings;
use autodie;
use feature qw(say);
use constant {
    FIND_FILE  => '/home/atsuser/Users/srittamp/find.txt',
    CONF_FILE  => '/home/atsuser/Users/srittamp/ns.conf',
};

open my $conf_fh, "<", CONF_FILE;
my %conf_hash;
while ( my $line = <$conf_fh> ) {
    chomp $line;
    next unless line =~ /add|set|enable\s+(\w+)/;
    $conf_hash{$1} = $1;
}
close $conf_fh;

open my $find_fh, ">", FIND_FILE;
for my $config ( sort keys %conf_hash ) {
    say {$find_fh} $config;
}
close $find_fh;

の形式がわからないため、何を探しているのか正確にはわかりませんconf.ns。正規表現の一致は 100% 正確ではない可能性があります。

2 つのループ: 最初のループでは、ハッシュで探しているものをすべてハッシュ キーとして格納します。これにより、固有の問題 ( sort | uniq) が処理されます。2 つ目は、保存されているキーを並べ替えて出力するだけです。

シンプルでクリーン、そしておそらくはるかに高速です。さらに、生成して他の 2 つのプロセスが完了するのを待つ必要がなくなり、オペレーティング システムへの依存関係の問題がなくなりました。Solaris version ofgrep doesn't have an-o` parameter 1、および Windows にはこれらの基本的な Unix スタイルのコマンドがありません。


1少なくとも、私が最後に Solaris で作業したときはそうではありませんでした。それはかなり前のことです。

于 2013-07-09T13:32:35.450 に答える