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