(완료)perl] ps -ef 명령 결과 저장 파서 만들기

gracesky의 이미지

ps -ef를 수행한 후 결과를 줄 단위로 split 하여 각각 항목별로 변수에 저장하는 스크립트를 만들었습니다.

ps -ef 결과]
% ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Nov12 ? 00:00:07 init [3]
root 2 1 0 Nov12 ? 00:00:00 [migration/0]
root 3 1 0 Nov12 ? 00:00:00 [posix_cpu_timer]
......

script]
#!usr/bin/perl

$Result = `ps -ef`;
@splitResult = split('\n', $Result);
if($splitResult[1] =~ /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/)
{
$UID = $1;
$PID = $2;
$PPID = $3;
$TIME = $7;
$CMD = $8;

print "PID=$PID, CMD=$CMD\n";
}

대충 위와 같이 쓰고 있는데 정규표현식을 '(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/' 이렇게 만든것이 영 마음에 안드네요. '(\S+)\s+{8}' 이런 형태도 시도해봤는데 원하는 결과가 안나와서 여쭤봅니다. 이런 경우에 정규표현식을 좀 더 유연하게 만들 수 있는 방법이 있을까요?

sephiron의 이미지

그냥 split을 한 번 더 써주시면 될 듯

aero의 이미지

#!/usr/bin/env perl
use strict;
use warnings;
 
open my $fh, '-|', 'ps -ef';
 
my $first_line = <$fh>;
chomp $first_line;
my @field_names = split /\s+/, $first_line;
 
while ( my $line = <$fh> ) {
    chomp $line;
    my %f;
    @f{@field_names} = split /\s+/, $line, scalar @field_names;
    print "PID=$f{PID}, CMD=$f{CMD}\n";
}

결과
PID=4594, CMD=/sbin/getty 38400 tty3
PID=4596, CMD=/sbin/getty 38400 tty6
PID=4634, CMD=/sbin/syslogd -u syslog
PID=4652, CMD=/bin/dd bs 1 if /proc/kmsg of /var/run/klogd/kmsg
PID=4654, CMD=/sbin/klogd -P /var/run/klogd/kmsg
.
.
.
gracesky의 이미지

또 배우고 갑니다