如何在 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 .
我想通过 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 .