0

我正在运行以下命令并将 4 行作为输出。

userid@server:/home/userid# ps -ef|grep process

这是命令的输出。

userid  10117  9931  0 06:25 pts/0    00:00:00 grep process
userid  15329     1  0 Jul11 ?        00:03:40 process APP1
userid  15334 15329  1 Jul11 ?        2-00:40:53 process1 APP1
userid  15390 15334  0 Jul11 ?        05:19:31 process2 APP1

我想使用 perl 将值 APP1 保存到变量中。所以我想要一个像$APP = APP1.

4

4 回答 4

0

我使用单行命令来获得所需的结果。

#!/usr/bin/perl
use strict;
use warnings;
my $app1
$app1 = ( split /\s+/, `pgrep -f process1` )[-1];
print ($app1);
于 2014-01-07T12:41:13.430 回答
0

试试这个(在这种情况下,您的输出在文件中in.txt):

perl -ne ' /(APP\d+)/g; print "$1\n";' in.txt

印刷:

APP1
APP1
APP1
于 2013-11-12T12:45:36.207 回答
0

也许对捕获的 APPS1 使用数组会有所帮助:

use strict;
use warnings;

my @apps;

while (<DATA>) {
    push @apps, $1 if /process\d*\s+(.+)/;
}

print "$_\n" for @apps;

__DATA__
userid  10117  9931  0 06:25 pts/0    00:00:00 grep process
userid  15329     1  0 Jul11 ?        00:03:40 process APP1
userid  15334 15329  1 Jul11 ?        2-00:40:53 process1 APP1
userid  15390 15334  0 Jul11 ?        05:19:31 process2 APP1

输出:

APP1
APP1
APP1
于 2013-11-12T19:45:34.103 回答
0

APP1命令行上的最后一个条目吗?process*或者,它是命令之后的第二个单词吗?

如果它是该行的最后一个,您可以使用以下命令:

use strict;
use warnings;
use autodie;

open my $command_output, "|-", "pgrep -fl process";
while ( my $command = < $command_output > ) {
    $command =~ /(\w+)$/;
    my $app = $1;  #The last word on the line...

否则,事情会变得更加棘手。我正在使用pgrep而不是ps -ef | grep. 该ps命令返回一个标题,以及许多字段。您需要拆分它们,并全部解析它们。此外,它甚至会向您显示grep用于获取您感兴趣的进程的命令。

pgrep带有-f和参数的命令-l不返回标头,只返回进程 ID,后跟完整的命令。这使得使用正则表达式解析变得更加容易。(如果您不了解正则表达式,则需要了解它们。)

open my $command_output, "|-", "pgrep -fl process";
while ( my $command = < $command_output > ) {
    if ( not $process =~ /^\d+\s+process\w+\s+(\w+)/ ) {
        next;
    }
    my $app = $1;  #The second word in the returned command...

没有必要分裂或混乱。没有要跳过的标题 正则表达式匹配数字进程 ID、process命令,然后选择第二个单词。我什至检查以确保输出pgrep符合我的预期。否则,我会得到下一行。

于 2013-11-13T00:03:10.500 回答