簡體   English   中英

如何將“ ps -ef”的輸出拆分為“行輸出”

[英]How can I split the output of “ps -ef” into “row output”

如何將“ ps -ef”的輸出拆分為“ row output”。 我遇到的問題之一是在字符串標記化過程中如何將“ 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

這是一種方法:

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將行直接讀入字段數組中,但是命令以多個元素的形式出現,將其組合回一個單詞還需要更多的工作。

使用以下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

這是使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM