如何在 shell 中逐行从 `ps` 获取输出

how to get output from `ps` line by line in shell

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

#!/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

如何解决

根据 melpomene 的评论,这应该在 keeping compatibility to sh.

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

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

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

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

这意味着如果你只提供一个变量(我在上面的例子中称它为 "line"),你将得到整行,不拆分,你不需要担心设置 IFS .