0

「ps -ef」の出力を「行出力」に分割するにはどうすればよいですか。私が抱えている問題の 1 つは、文字列のトークン化中に "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

1 つの方法を次に示します。

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

次のシェル スニペットを使用します

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

を使用する 1 つの方法を次に示し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 に答える