3. perl/コマンドの実行結果を取得する

 
3.1 コマンドの実行結果を取得する

3.1 コマンドの実行結果を取得する

 やりたかったのは表題の通り。
 PID TT  STAT    TIME COMMAND
 640 v0- I    0:00.02  /usr/local/bin/postgres -D /var/db/postgres/data96
2068 v0  Is+  0:00.00  /usr/libexec/getty Pc ttyv0
2069 v1  Is+  0:00.00  /usr/libexec/getty Pc ttyv1
2070 v2  Is+  0:00.00  /usr/libexec/getty Pc ttyv2
2071 v3  Is+  0:00.00  /usr/libexec/getty Pc ttyv3
2072 v4  Is+  0:00.00  /usr/libexec/getty Pc ttyv4
2073 v5  Is+  0:00.00  /usr/libexec/getty Pc ttyv5
2074 v6  Is+  0:00.00  /usr/libexec/getty Pc ttyv6
2075 v7  Is+  0:00.00  /usr/libexec/getty Pc ttyv7
2162  0  Ss   0:00.01 USER=hogehoge LOGNAME=hogehoge HOME=/home/hogehoge MAIL=/var/mail/hogehoge PATH=/sbin:/bin:/usr/sbin:/usr/b
2164  0  R+   0:00.00 USER=hogehoge LOGNAME=hogehoge HOME=/home/hogehoge MAIL=/var/mail/hogehoge PATH=/sbin:/bin:/usr/sbin:/usr/b

 で出力される結果からある条件で grep をかけて、プロセスIDのみを収集して出力したいのです。
 シェルスクリプトで組もうとも思ったのですが、perl の方が楽のように思えたので

 まず、単純に取得結果を出力するには

#!/usr/bin/perl
my $result = `ps -afe`;
print $result;

 この中から、postgres をキーワードにした1行を取り出して表示するには

#!/usr/bin/perl
my $result = `ps -afe`;

foreach my $line(@result)
{
    if ($line =~ /postgres/)
    {
        print $line;
    }
}

 さらにプロセスIDのみを表示するには

#!/usr/bin/perl
my @result = `ps -afe`;

foreach my $line(@result)
{
    if ($line =~ /postgres/)
    {
        my @word = split(/ /, $line);
        print $word[1]."\n";
    }
}

 キーワード postgres を引数として渡すには

#!/usr/bin/perl
my @result = `ps -afe`;

foreach my $line(@result)
{
    if ($line =~ /$ARGV[0]/)
    {
        my @word = split(/ /, $line);
        print $word[1]."\n";
    }
}

 これで、ソースファイルに実行権限をつけて

> chmod +x ファイル.pl
> ./ファイル.pl 引数

 で実行できます。