views:

2350

answers:

3

I am using 'tail -f' to follow a log file as it's updated:

tail -f logfile

I next pipe the output of that to grep to show only the lines containing a search term ("org.springframework" in this case):

tail -f logfile | grep org.springframework

The third step I'd like to make is piping the output from grep to a third command, 'cut':

tail -f logfile | grep org.springframework | cut -c 25-

The cut command would remove the first 25 characters of each line for me if it could get the input from grep! (It works as expected if I eliminate 'grep' from the chain.)

I'm using cygwin with bash if that matters.

Thanks in advance for your assistance, O Mighty Scripting Gods, Ye!

-- LES

Edit: Actual results: When I add the second pipe to connect to the 'cut' command, the result is that it hangs, as if it's waiting for input (in case you were wondering).

Edit 2: Corrected typo in cut command

+1  A: 

What you have should work fine -- that's the whole idea of pipelines. The only problem I see is that, in the version of cut I have (GNU coreutiles 6.10), you should use the syntax cut -c 25- (i.e. use a minus sign instead of a plus sign) to remove the first 24 characters.

You're also searching for different patterns in your two examples, in case that's relevant.

Adam Rosenfield
oops! i am using the 'minus' sign - that was a typo in my post here
LES2
+3  A: 

On my system, about 8K was buffered before I got any output. This sequence worked to follow the file immediately:

tail -f logfile | while read line ; do echo "$line"| grep 'org.springframework'|cut -c 25- ; done
Dennis Williamson
just got back to this and this one worked
LES2
+3  A: 

Assuming GNU grep, add --line-buffered to your command line, eg.

tail -f logfile | grep --line-buffered org.springframework | cut -c 25-

Edit:

I see grep buffering isn't the only problem here, as cut doesn't allow linewise buffering.

you might want to try replacing it with something you can control, such as sed:

tail -f logfile | sed -u -n -e '/org\.springframework/ s/\(.\{0,25\}\).*$/\1/p'

or awk

tail -f logfile | awk '/org\.springframework/ {print substr($0, 0, 25);fflush("")}'
Hasturkun
--line-buffered didn't work for me - that buffers the *output* of grep. If you do tail -f logfile|cut -c 25- it still just sits there. The buffering is being done on the output of tail.
Dennis Williamson
Revised, seems like you're being bitten by stdout buffering in cut, these should work for you
Hasturkun