Count lines and words of a stream output with tail


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Count lines and words of a stream output with tail
# 1  
Old 10-16-2013
Count lines and words of a stream output with tail

Hello,

I need to tail -f a file output stream and I need to get only lines that contains "get" and "point" in the same line. It doesn't matter the order.

Then I need only the text BEFORE "point".

I have to count each line and perform other serveral actions after this has performed 3 times.

I have done something like this. But I don't know how to go on.
I am currently learning about AWK. I don't know if there's a straight forward way to do this with AWK. It would be nicer to avoid "grep".

Code:
tail -f file | grep --line-buffered "get.*point\|point.*get" | awk 'BEGIN {FS="point"} {print $1}'

The tail -f output would be something like this:

Code:
Hello world. This is my point.
How to get your point?
I would like to get a point. Do you?
I do not know how to get my point.

And after processing it, it should do something to get the lines with "get" and "point". It would see something like this:

Code:
How to get your point?
I would like to get a point. Do you?
I do not know how to get my point.

Next step is extracting everything before "point":

Code:
How to get your
I would like to get a 
I do not know how to get my

Count words in each line:

Code:
4
6
8

And quit when this is performed 3 times. So it will quit tail -f right now because it has perform it three times.

I am getting very frustrated.. Thanks a lot for any idea you can give..
# 2  
Old 10-16-2013
Quote:
Originally Posted by Kibou
Hello,

I need to tail -f a file output stream and I need to get only lines that contains "get" and "point" in the same line. It doesn't matter the order.

Then I need only the text BEFORE "point".

I have to count each line and perform other serveral actions after this has performed 3 times.

I have done something like this. But I don't know how to go on.
I am currently learning about AWK. I don't know if there's a straight forward way to do this with AWK. It would be nicer to avoid "grep".

Code:
tail -f file | grep --line-buffered "get.*point\|point.*get" | awk 'BEGIN {FS="point"} {print $1}'

The tail -f output would be something like this:

Code:
Hello world. This is my point.
How to get your point?
I would like to get a point. Do you?
I do not know how to get my point.

And after processing it, it should do something to get the lines with "get" and "point". It would see something like this:

Code:
How to get your point?
I would like to get a point. Do you?
I do not know how to get my point.

Next step is extracting everything before "point":

Code:
How to get your
I would like to get a 
I do not know how to get my

Count words in each line:

Code:
4
6
8

And quit when this is performed 3 times. So it will quit tail -f right now because it has perform it three times.

I am getting very frustrated.. Thanks a lot for any idea you can give..
try

Code:
$ awk '{print NF}' file

Code:
4
6
8

# 3  
Old 10-16-2013
Thanks for the reply.
It needs to be done to the stream coming from tail -f, not a file.

I have tried appending that at the end but it doesn't work either...

Edit-

Also, this needs to be done "on the fly" because I have to measure the time while this is done.

Thanks.
# 4  
Old 10-16-2013
One way to do it would be to run the tail/awk pipe in a background subshell, redirect that output to a temp file, and have the parent script terminate the subshell when the file is 3 lines long.

Some rough (and untested!) code:
Code:
tempfile=$(mktemp -t XXXXXXXX.$$) || exit 1

( tail -f file.txt |  awk '/get|point/ {gsub (/point.*/,"");print NF}' | tee "${tempfile}" ) &
tailpid=$!

while true
do
        sleep 1
        found=$(wc -l "${tempfile}"|awk '{print $1}')
        [ $found -gt 3 ] && break
done

rm "${tempfile}"
kill $tailpid

These 2 Users Gave Thanks to CarloM For This Post:
# 5  
Old 10-16-2013
Thanks so much. I have learned a lot.

Here is the final version of the script. It works like a charm!

Code:
tempfile=$(mktemp -t XXXXXXXX.$$) || exit 1


(tail -f file | grep --line-buffered "message.*@\|@.*message" | awk 'BEGIN {FS="@"} {print $1;fflush()}' | tee "${tempfile}") &
pid=$!

while true
do
    sleep 0.5

    found=`wc -l "${tempfile}"|awk '{print $1}'`

    [ $found -ge 3 ] && break

done

rm "${tempfile}"
kill $pid

I loved all those details, like the file made with mktemp. Excellent.

I just had to find out one more thing: how to output tail -f and awk. It works with the fflush() function.

Amazing. Thanks so much.

---------- Post updated at 10:57 PM ---------- Previous update was at 10:44 PM ----------

I was so happy that I forgot one more thing. But this is an easy one: counting words.

Code:
tempfile=$(mktemp -t XXXXXXXX.$$) || exit 1

words=/path/words.txt


(tail -f file | grep --line-buffered "message.*@\|@.*message" | awk 'BEGIN {FS="@"} {print $1;fflush()}' | tee "${tempfile}") &
pid=$!

while true
do
    sleep 0.5

    found=`wc -l "${tempfile}"|awk '{print $1}'`

    wc -w "${tempfile}"|awk '{print $1}' > "${words}"


    [ $found -ge 3 ] && break

done

rm "${tempfile}"
kill $pid

Regards.
These 2 Users Gave Thanks to Kibou For This Post:
# 6  
Old 10-16-2013
Quote:
One way to do it would be to run the tail/awk pipe in a background subshell, redirect that output to a temp file, and have the parent script terminate the subshell when the file is 3 lines long.

Some rough (and untested!) code:


Code:
tempfile=$(mktemp -t XXXXXXXX.$$) || exit 1( tail -f file.txt | awk '/get|point/ {gsub (/point.*/,"");print NF}' | tee "${tempfile}" ) &tailpid=$!while truedo sleep 1 found=$(wc -l "${tempfile}"|awk '{print $1}') [ $found -gt 3 ] && breakdonerm "${tempfile}"kill $tailpid

Hello CarloM,

Thanks a lot for great code. Could you please explain it.


Thanks,
R. Singh
# 7  
Old 10-17-2013
@CarloM: May i ?
Hope my understanding is correct below:

Code:
First create a temporary file.
Second, tail the running log and awk looks for get or point string and substitute globally after the point to empty, 
pipe the number of fields after substitution to tee command , which shows the output to standard output & file created in first step.
Execute the complete second step in the background.
third one is , store the background process in to variable using shell builtin variable.
Start infinitive loop, pipe the number of lines in tempfile and print the first field using awk.
when test operator checks it greater than 3 then break the loop.

remove the temp file and kill the background process.
These 2 Users Gave Thanks to greet_sed For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Count words/lines between two tags using awk

Is there an efficient awk that can count the number of lines that occur in between two tags. For instance, consider the following text: <s> Hi PP - my VBD - name DT - is NN - . SENT . </s> <s> Her PP - name VBD - is DT - the NN - same WRT - . SENT - </s> I am interested to know... (4 Replies)
Discussion started by: owwow14
4 Replies

2. Shell Programming and Scripting

How count the number of two words associated with the two words occurring in the file?

Hi , I need to count the number of errors associated with the two words occurring in the file. It's about counting the occurrences of the word "error" for where is the word "index.js". As such the command should look like. Please kindly help. I was trying: grep "error" log.txt | wc -l (1 Reply)
Discussion started by: jmarx
1 Replies

3. UNIX for Dummies Questions & Answers

Count the lines with the same values in a column and write the output to a file

Hey everyone! I have a tab delimited data set which I want to create an output contained the calculation of number of those lines with a certain value in 2nd and 3rd column. my input file is like this: ID1 1 10M AAATTTCCGG ID2 5 4M ACGT ID3 5 8M ACCTTGGA ID4 5 ... (7 Replies)
Discussion started by: @man
7 Replies

4. Shell Programming and Scripting

Deleting lines from a stream after matching a pattern

Hi, I have a requirement to to an ldapsearch and remove the shadow attributes in the output file. What I do is ldapsearch() | operation to remove shadow > FILE The ldapsearch gives output like this(with same line formation): objectClass: FSConfig objectClass: extensibleObject fsCAIP:... (10 Replies)
Discussion started by: lorzinian
10 Replies

5. Shell Programming and Scripting

Scripting help to identify words count in lines

Hi everybody, i have this biological situation to fix: > Id.1 ACGTACANNNNNNNNNNNACGTGCNNNNNNNACTGTGGT >Id.2 ACGGGT >Id.3 ACGTNNNNNNNNNNNNACTGGGGG >Id.4 ACGTGCGNNNNNNNNGGTCANNNNNNNNCGTGCAAANNNNN ........ .... These are nucleotidic sequences with some "NNNN..." always of the same... (4 Replies)
Discussion started by: Giorgio C
4 Replies

6. Shell Programming and Scripting

Shell script to find out words, replace them and count words

hello, i 'd like your help about a bash script which: 1. finds inside the html file (it is attached with my post) the code number of the Latest Stable Kernel, 2.finds the link which leads to the download location of the Latest Stable Kernel version, (the right link should lead to the file... (3 Replies)
Discussion started by: alex83
3 Replies

7. Shell Programming and Scripting

Count the no of lines between two words

Please help in the following problem: Input is: Pritam 123 456 Patil myname youname Pritam myproject thisproject iclic Patil remaining text some more text I need the command which will display the no of lines between two words in the whole file. e.g. Display all the no of lines... (5 Replies)
Discussion started by: zsudarshan
5 Replies

8. Shell Programming and Scripting

awk help needed in trying to count lines,words and characters

Hello, i am trying to write a script file in awk which yields me the number of lines,characters and words, i checked it many many times but i am not able to find any mistake in it. Please tell me where i went wrong. BEGIN{ print "Filename Lines Words Chars\n" } { filename=filename + 1... (2 Replies)
Discussion started by: salman4u
2 Replies

9. UNIX for Dummies Questions & Answers

how can I use the stream output in other program

Hello I wander if im doing : ls -l and its giving me lets say 3 results : -rw-r--r-- 1 blah other 1789 May 19 2003 foo.c -rw-r--r-- 1 blah other 1014 May 19 2003 foo.h -rw-r--r-- 1 blah other 270 May 19 2003 foo1.c now I would like to use the first... (1 Reply)
Discussion started by: umen
1 Replies

10. Programming

stream output??

Hi all, I've a structure let's say typdef struct a { int a; int b; char* string} b; I need to make the function smth like readdir(), returning everytime it's called pointer to the next structure. Let's say functions would read the next file in the directory and all the permitions put it in... (2 Replies)
Discussion started by: solvman
2 Replies
Login or Register to Ask a Question