Hack like a pro: shell `pipe`
Hi again UNIX shell lovers, as we saw in our last course, a shell command outputs non-errors messages to a special file called stdout
, which number is 1
and reads from another special file called stdin
which number is 0
. Error messages are sent to stderr
which number is 2
.
To be clear, this means that the following command:
$ ls
. .. foo bar baz
displayed its result to the special file stdout
, or 1
.
This output can actually be captured by another program by using the |
(pipe) symbol. To illustrate its usage, we will use the grep
command, which filters the output by matching a pattern. For example, if I would like to output only the lines that contain the word match
in a file called myfile.txt
, I would do:
$ grep match myfile.txt
beautiful match
matching
those matches
Instead of using a file as the input stream, we could use stdout
from a previous command, which the |
(pipe) command will transform to grep
's stdin
!
$ echo 'I like to move it move it'|grep 'move'
I like to move it move it
$ echo 'this phrase won't match'|grep 'not present'
Think of |
as a convenient way of filtering big outputs, for example you could very easily see if a directory contains a .jpg
file by using |grep '\.jpg'
. We won't go deep into grep
patterns just yet to keep those courses nice and short :)
In our next shell tip, we will speak about redirections. Stay tuned!
Read more about standard streams in Wikipedia's very well written documentation.
Congratulations @imil! You have completed some achievement on Steemit and have been rewarded with new badge(s) :
Award for the number of posts published
Click on any badge to view your own Board of Honnor on SteemitBoard.
For more information about SteemitBoard, click here
If you no longer want to receive notifications, reply to this comment with the word
STOP
By upvoting this notification, you can help all Steemit users. Learn how here!
Very cool. I'm always using grep to search recursively:
grep -r 'something' somedirectory
so thanks for the reminder you can use it on a single file.I also like to use it to filter results of find:
ls -l | grep '2017'
Would be files from this year in the current directory.
Following you.
Thanks @mikeill, I'll eventually get to more difficult scenarios, my first target here are less fluent linux/unix users, I'd like to make them love the CLI ;) but comments from more educated users are really welcome too! Following you back
Sweet. See you around.