0

如何将“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
4

3 回答 3

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,但随后该命令以多个元素的形式出现,将其组合回一个单词需要更多的工作。

于 2012-12-04T03:36:09.927 回答
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
于 2012-12-04T00:34:27.363 回答
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
于 2012-12-04T01:21:49.857 回答