如何将“ps -ef”的输出拆分为“行输出”

时间:2012-12-04 00:24:53

标签: bash shell

如何将“ps -ef”的输出拆分为“行输出”。我遇到的一个问题是如何在字符串标记化过程中将“gpm -m / dev / input / mice -t exps2”作为单个项目处理。

如果'ps -ef'输出是这样的:

root      3410     1  0 Jun17 ?        00:00:00 gpm -m /dev/input/mice -t exps2
root      3424     1  0 Jun17 ?        00:00:00 crond
root      3488     1  0 Jun17 ?        00:00:00 /usr/sbin/atd

然后,我怎么能打印它看起来像:

1:
root
3410
00:00:00
gpm -m /dev/input/mice -t exps2

2: 
root
3424
00:00:00
crond

3: 
root
3488
00:00:00
/usr/sbin/atd

3 个答案:

答案 0 :(得分:2)

这是一种方式:

let i=0
while read line; do
  read user pid _ _ _ _ time command <<<"$line"
  if [ "$user" != UID ]; then # skip header line
    printf "%s\n" $((++i)): "$user" "$pid" "$time" "$command" ""
  fi
done < <(ps -ef)

你也可以使用read -a将行直接读入一个字段数组中,但是然后命令以多个元素的形式出现,将它组合成一个单词需要更多的工作。

答案 1 :(得分:1)

使用以下shell代码段

OIFS=$IFS
IFS=$'\n'
i=0
for line in `ps -ef`; do
    echo "$i:"
    echo $line | cut -d' ' -f1
    echo $line | cut -d' ' -f2
    echo $line | cut -d' ' -f7
    echo $line | cut -d' ' -f8-
    (( i++ ))
done
IFS=$OIFS

答案 2 :(得分:0)

这是使用awk的一种方式:

ps -ef | awk -v OFS="\n" '{ for (i=8;i<=NF;i++) line = (line ? line FS : "") $i; print NR ":", $1, $2, $7, line, ""; line = "" }'

结果:

1:
root
3410
00:00:00
gpm -m /dev/input/mice -t exps2

2:
root
3424
00:00:00
crond

3:
root
3488
00:00:00
/usr/sbin/atd