I find myself always having to arrow up and going backwards through the command line to change one part of an earlier command that is pipped to a later grep
or head
or whatever command.
For a crude example: searching dmesg
for a given string and only wanting the last 5 occurrences.
I would do the above such that:
dmesg | grep -i USB | tail -n 5
but then if I want to change the search term or what I am searching for or the source, I am waiting for my cursor to backtrace to the relevant part of the line. I'd like to move that to the end of the line such that the above example could be represented as (I know this is incorrect):
tail -n 5 < dmesg | grep -i USB
(and I could then search for sda
)
as I said, this is a crude example and is indicative of the sort of thing I'd LIKE to do, but not actually what I want to do, ie. this isn't about dmesg
or the use of grep
and tail
, but how to interact between these programs placing the "variable" at the end.
This could be further exampled on getting the seek time on a DNS enquiry such that:
dig google.com | grep msec
(let's move google.com
to the end so that I can then test another domain) via
grep msec < dig google.com
again, poor examples. I am talking more about when I have input/outputs flowing between multiple programs
I do admit I only have a basic understanding of piping and redirection which could be summarised as:
- piping (
|
) using thestdout
of one program to feed into thestdin
of another - redirect (
>
) taking thestdout
of one program and feeding it into a file (aside: could it be redirected elsewhere other than the only obvious ones I can think of
> /dev/null
or
> /dev/sda
or
> {said file}
whereas piping is program output as program input going left to right. - redirect (
<
) (which I call "file as input") taking the contents of a file and using those as if they'd been typed at the command line