Monday, July 1, 2019

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





I want to list a process with its infos through ps in shell.
Here is my script:




#!/bin/sh

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


But output is:




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


It divide the line into many parts, but I want I can get one line information about the process which name is test.py like command in terminal:



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



how to solve that


Answer



The read command will read one line from standard input and place it into a variable for you. It'll exit with status 1 when it reaches the end of input, which you can use to end a while loop:



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

done


If you want it to, read will split the input into separate variables using the internal field separator (IFS), and if the input has more fields than variables, it'll stop splitting when it gets to your last variable and just put the remainder of the line, unsplit, in there.



Which means that if you supply just one variable (I called it "line" in the example above), you'll get the whole line, unsplit, and you won't need to worry about setting IFS.


No comments:

Post a Comment

plot explanation - Why did Peaches' mom hang on the tree? - Movies & TV

In the middle of the movie Ice Age: Continental Drift Peaches' mom asked Peaches to go to sleep. Then, she hung on the tree. This parti...