[英]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.