I'm often annoyed by the same thing, and there are a few ways of dealing with it:
Just accept it, sometimes it's not worth spending any time to work around it.
as PSkocik mentioned, you can use e.g. tail -n 5 <(dmesg | grep USB)
Become more adept with your shell's editing capabilities - e.g. in bash (and many other programs that use readline) you can use CtrlA to get to beginning of line, ESCf and ESCb to move forward and back a "word", and Ctrl-XCtrl-E to edit the current line in $EDITOR (e.g. vim
)
There are many more editing commands available and readline
is fully documented in .info files. On a Debian system, install the readline-doc
package. Other distros may include the documentation in the readline package itself or may separate it as Debian does.
I also recommend installing and using pinfo
for a more lynx web-browser-like experience (IMO the GNU info
browser is ghastly and almost unusable). If it's not already in your distro, you can find it at http://pinfo.alioth.debian.org/
readline
also has a vi
mode for editing (the default is an emacs
-like mode), which some people prefer.
In simple cases, you can use quick substitution: e.g. if the last command you entered was:
dmesg | grep -i USB | tail -n 5
then typing ^USB^sda^Enter would result in this being executed:
dmesg | grep -i sda | tail -n 5
For more details on this, see man bash
and search for HISTORY EXPANSION
, especially the section Event Designators
.
and yes, doing this repeatedly also becomes annoying.
- For more complex cases, the best solution is to write a shell script or function that does what you want and run that instead of your long complicated pipeline of commands.
e.g. write a shell script called dmesg-grep
that looks something like this:
#! /bin/bash
# regexp to search for is arg 1. needs to be an extended regexp
# because we're using grep -E aka egrep.
re="$1"
# number of lines to output is optional arg 2 (default 5)
lines=${2:5}
dmesg | grep -iE "$re" | tail -n "$lines"
Then you can just run dmesg-grep usb
or dmesg-grep sda
.
If you do this a lot, make a bin
subdirectory of your home directory and add ~/bin
to your default PATH (e.g. in ~/.bash_profile
or ~/.bashrc
) and save your scripts in there.
Best Answer
executes A and B (in parallel), and the standard output of A is fed into the standard input of B. In the case of
the shell executes first B, collects the standard output of B, then executes A, but for this execution assigns the individual word's to the ARGV-vector of A (i.e. A can access these words by the usual argv mechanism known from C and other language).
Aside from the fact that in both cases two programs A and B are involved, I don't see anything similar between them.