Run rsync, pipe to tee, and redirect the output to a named pipe (mkfifo). Open a second terminal and direct the named pipe into a grep command. Arrange the terminals in whatever way you want.
mkfifo mypipe
rsync | tee mypipe
grep "denied" < mypipe
From Wikipedia, the free encyclopedia
Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).
Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.
Community icon by Alpár-Etele Méder, licensed under CC BY 3.0
Run rsync, pipe to tee, and redirect the output to a named pipe (mkfifo). Open a second terminal and direct the named pipe into a grep command. Arrange the terminals in whatever way you want.
mkfifo mypipe
rsync | tee mypipe
grep "denied" < mypipe
Elegant and flexible, thank you!
Tmux is a very helpful terminal multiplexer, meaning it can split your terminal into multiple panes. So, create two side by side panes, then one way of doing it is:
your cmd | tee >(grep 'denied' > error.log)
tail -f error.log
The tee
process takes it's standard in, and writes itbto both standard out, so you see all the lines, and the path it's been given. The >(...)
operator runs the grep in a subprocess, and returns the path to it's standard input pipe, so grep
receives every line, and writes the denied lines to a log file which you display with tail
in the other pane.
Rather than using a file for error.log you could also use a named pipe in much the same way.
Thanks! I'm curious if there is a way to do this as a one-liner?
Sorry for th slow answer, I've been away. There is a way, if it's still useful to you:
First, create a named fifo, you only need to do this once:
mkfifo logview
Run your rsync in one pane, with a filtered view in the second:
tmux new 'rsync ...options... |& tee logview' \; split-window -h 'grep "denied" logview'
Replace ...options...
with your normal rsync command line.
That should give you a split view, with all the normal messages on the left, and only messages containing 'denied' on the right.
The |&
makes sure we capture both stdout and stderr, tee
then writes them to the fifo and displays them. split-window
tells tmux to create a second pane, and display the output of grep.
Thanks!
Given encouragement to try tmux, here is what I've come up with as a "one-liner" (script) that does what I was originally looking for:
#!/bin/sh
tmux new-session -d -s split_screen_grep \; \
send-keys "/bin/sh -c '$1' | tee /tmp/split_screen_grep.txt" C-m \; \
split-window -h \; \
select-pane -t 1 \; \
send-keys "tail -f /tmp/split_screen_grep.txt | grep '$2'" C-m \;
tmux attach-session -t split_screen_grep
I use it as follows, first arg is a command, second arg is a pattern to search for:
$ ./split-grep "cat big_file.txt" "tmux"
I usually solve this kind of problem by piping to less
or a logfile and then just searching in there. You can get it to refresh new content by pressing the End key twice. Or maybe less just needs the -f
flag or something similar. I'm too lazy to look it up.
less
can enter a grep-like mode by hitting ~~/
~~
Edit: it's &
for the grep mode, /
is search.
More info: / only searches from cursor to end of file. ? searches from cursor to start of file.
Oops yeah I just edited my comment, put the wrong symbol!
That's not at all grep-like. Grep is a line filter, not a character sequence highlighter.
Oops sorry it's &
! /
is find
ChatGPT suggests the following:
rsync -naP --exclude-from=rsync-homedir-local.txt /home/$USER/ $BACKUPDIR/ | tee /tmp/rsync_output.txt
tail -f /tmp/rsync_output.txt | grep denied
Not quite a one-liner, but I can see how tmux is a big help here.
I know this isn't an answer you're looking for, but I'll at least say that I find tmux to be infinitely useful and highly recommend checking it out
Tmux is also good for long operations, as tmux is running as a server and you can close the terminal while tmux chugs away. Others can also connect to the tmux session through ssh and share screens.
Don't feed the beast.
Your request goes against the unix philosophy. Grep does one thing and does it well. If you desire additional functionality, you should add another utility to accomplish what you want.
rsync -naP --exclude-from=rsync-homedir-local.txt /home/$USER/ $BACKUPDIR/ | grep denied
In your specific task, utilize bashims to do (what I think) you want:
rsync -naP --exclude-from=rsync-homedir-local.txt /home/$USER/ $BACKUPDIR/ || echo "task failed"
Funnily enough Astrogrep on Windows is great for this
Skim has an interactive mode.