如何在shell

时间:2017-10-06 11:09:27

标签: linux shell sh ps

我想在shell中通过ps列出一个包含其信息的进程。 这是我的剧本:

#!/bin/sh

for line in `ps aux| grep test.py`
do
    echo $line
done

但输出是:

hey
13241
0.0
0.3
48388
13528
pts/18
S+
18:50
0:00
python
test.py
hey
13370
0.0
0.0
14504
1016
pts/21
S+
19:00
0:00
grep
test.py

它将行划分为多个部分,但我希望我能得到一个关于进程的行信息,其名称为test.py,如终端中的命令:

hey   13241  0.0  0.3  48388 13528 pts/18   S+   18:50   0:00 python test.py
hey   13446  0.0  0.0  14504   976 pts/21   S+   19:08   0:00 grep --color=auto test.py

如何解决

2 个答案:

答案 0 :(得分:1)

根据melpomene的评论,这应该适用于keeping compatibility to sh

#!/bin/sh
ps aux | grep test.py | while IFS= read -r line; do
    printf '%s\n' "$line"
done 

答案 1 :(得分:1)

read命令将从标准输入读取一行并将其放入变量中。当它到达输入结束时,它将以状态1退出,您可以使用它来结束while循环:

ps aux | grep test.py | while read line; do
  echo LINE:
  echo "$line"
  echo
done

如果你想要它,read将使用内部字段分隔符(IFS)将输入拆分为单独的变量,如果输入的字段多于变量,它将在它到达你的时间时停止分割最后一个变量,只需将行的其余部分(未分割)放在那里。

这意味着如果你只提供一个变量(我在上面的例子中称之为“line”),你将得到整行,unsplit,你不必担心设置IFS。