Speak now
Please Wait Image Converting Into Text...
Embark on a journey of knowledge! Take the quiz and earn valuable credits.
Challenge yourself and boost your learning! Start the quiz now to earn credits.
Unlock your potential! Begin the quiz, answer questions, and accumulate credits along the way.
Course Queries Syllabus Queries 2 years ago
Posted on 16 Aug 2022, this text provides information on Syllabus Queries related to Course Queries. Please note that while accuracy is prioritized, the data presented might not be entirely correct or up-to-date. This information is offered for general knowledge and informational purposes only, and should not be considered as a substitute for professional advice.
Turn Your Knowledge into Earnings.
If you were helping someone to learn the concept of pipes on the command line what example would you use? The example that actually came up was as follows:
cat whatever.txt | less
I feel like that's not the best example, namely because there's only one step. What's a good, but fundemental, use of |?
|
Ideally the example I'll present will use programs that have outputs themselves that can be run independently and then shown piped together.
I'm going to walk you through a somewhat complex example, based on a real life scenario.
Problem
Let's say the command conky stopped responding on my desktop, and I want to kill it manually. I know a little bit of Unix, so I know that what I need to do is execute the command kill . In order to retrieve the PID, I can use ps or top or whatever tool my Unix distribution has given me. But how can I do this in one command?
conky
kill
ps
top
Answer
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
DISCLAIMER: This command only works in certain cases. Don't copy/paste it in your terminal and start using it, it could kill processes unsuspectingly. Rather learn how to build it.
How it works
1- ps aux
ps aux
This command will output the list of running processes and some info about them. The interesting info is that it'll output the PID of each process in its 2nd column. Here's an extract from the output of the command on my box:
$ ps aux rahmu 1925 0.0 0.1 129328 6112 ? S 11:55 0:06 tint2 rahmu 1931 0.0 0.3 154992 12108 ? S 11:55 0:00 volumeicon rahmu 1933 0.1 0.2 134716 9460 ? S 11:55 0:24 parcellite rahmu 1940 0.0 0.0 30416 3008 ? S 11:55 0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6 rahmu 1941 0.0 0.2 160336 8928 ? Ss 11:55 0:00 xfce4-power-manager rahmu 1943 0.0 0.0 32792 1964 ? S 11:55 0:00 /usr/lib/xfconf/xfconfd rahmu 1945 0.0 0.0 17584 1292 ? S 11:55 0:00 /usr/lib/gamin/gam_server rahmu 1946 0.0 0.5 203016 19552 ? S 11:55 0:00 python /usr/bin/system-config-printer-applet rahmu 1947 0.0 0.3 171840 12872 ? S 11:55 0:00 nm-applet --sm-disable rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:38 conky -q
2- grep conky
grep conky
I'm only interested in one process, so I use grep to find the entry corresponding to my program conky.
grep
$ ps aux | grep conky rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q rahmu 3233 0.0 0.0 7592 840 pts/1 S+ 16:55 0:00 grep conky
3- grep -v grep
grep -v grep
As you can see in step 2, the command ps outputs the grep conky process in its list (it's a running process after all). In order to filter it, I can run grep -v grep. The option -v tells grep to match all the lines excluding the ones containing the pattern.
-v
$ ps aux | grep conky | grep -v grep rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
NB: I would love to know a way to do steps 2 and 3 in a single grep call.
4- awk '{print $2}'
awk '{print $2}'
Now that I have isolated my target process. I want to retrieve its PID. In other words I want to retrieve the 2nd word of the output. Lucky for me, most (all?) modern unices will provide some version of awk, a scripting language that does wonders with tabular data. Our task becomes as easy as print $2.
awk
print $2
$ ps aux | grep conky | grep -v grep | awk '{print $2}' 1948
5- xargs kill
xargs kill
I have the PID. All I need is to pass it to kill. To do this, I will use xargs.
xargs
xargs kill will read from the input (in our case from the pipe), form a command consisting of kill ( are whatever it read from the input), and then execute the command created. In our case it will execute kill 1948. Mission accomplished.
kill 1948
Final words
Note that depending on what version of unix you're using, certain programs may behave a little differently (for example, ps might output the PID in column $3). If something seems wrong or different, read your vendor's documentation (or better, the man pages). Also be careful as long pipes can be dangerous. Don't make any assumptions especially when using commands like kill or rm. For example, if there was another user named 'conky' (or 'Aconkyous') my command may kill all his running processes too!
man
rm
What I'm saying is be careful, especially for long pipes. It's always better to build it interactively as we did here, than make assumptions and feel sorry later.
No matter what stage you're at in your education or career, TuteeHub will help you reach the next level that you're aiming for. Simply,Choose a subject/topic and get started in self-paced practice sessions to improve your knowledge and scores.
Course Queries 4 Answers
Course Queries 5 Answers
Course Queries 1 Answers
Course Queries 3 Answers
Ready to take your education and career to the next level? Register today and join our growing community of learners and professionals.