Printing the last column of a line in a file

FileAwkTail

File Problem Overview


I have a file that is constantly being written to/updated. I want to find the last line containing a particular word, then print the last column of that line.

The file looks something like this. More A1/B1/C1 lines will be appended to it over time.

A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434

I tried to use

tail -f file | grep A1 | awk '{print $NF}'

to print the value 766, but nothing is output.

Is there a way to do this?

File Solutions


Solution 1 - File

You don't see anything, because of buffering. The output is shown, when there are enough lines or end of file is reached. tail -f means wait for more input, but there are no more lines in file and so the pipe to grep is never closed.

If you omit -f from tail the output is shown immediately:

tail file | grep A1 | awk '{print $NF}'

@EdMorton is right of course. Awk can search for A1 as well, which shortens the command line to

tail file | awk '/A1/ {print $NF}'

or without tail, showing the last column of all lines containing A1

awk '/A1/ {print $NF}' file

Thanks to @MitchellTracy's comment, tail might miss the record containing A1 and thus you get no output at all. This may be solved by switching tail and awk, searching first through the file and only then show the last line:

awk '/A1/ {print $NF}' file | tail -n1

Solution 2 - File

To print the last column of a line just use $(NF):

awk '{print $(NF)}' 

Solution 3 - File

One way using awk:

tail -f file.txt | awk '/A1/ { print $NF }'

Solution 4 - File

You can do this without awk with just some pipes.

tac file | grep -m1 A1 | rev | cut -d' ' -f1 | rev

Solution 5 - File

maybe this works?

grep A1 file | tail -1 | awk '{print $NF}'

Solution 6 - File

You can do all of it in awk:

<file awk '$1 ~ /A1/ {m=$NF} END {print m}'

Solution 7 - File

Using Perl

$ cat rayne.txt
A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434


$ perl -lane ' /A1/ and $x=$F[2] ; END { print "$x" } ' rayne.txt
766

$

Solution 8 - File

awk -F " " '($1=="A1") {print $NF}' FILE | tail -n 1

Use awk with field separator -F set to a space " ".

Use the pattern $1=="A1" and action {print $NF}, this will print the last field in every record where the first field is "A1". Pipe the result into tail and use the -n 1 option to only show the last line.

Solution 9 - File

Not the actual issue here, but might help some one: I was doing awk "{print $NF}", note the wrong quotes. Should be awk '{print $NF}', so that the shell doesn't expand $NF.

Solution 10 - File

Execute this on the file:

awk 'ORS=NR%3?" ":"\n"' filename

and you'll get what you're looking for.

Solution 11 - File

ls -l | awk '{print $9}' | tail -n1

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRayneView Question on Stackoverflow
Solution 1 - FileOlaf DietscheView Answer on Stackoverflow
Solution 2 - FileGennadiy ZolotaryovView Answer on Stackoverflow
Solution 3 - FileSteveView Answer on Stackoverflow
Solution 4 - FilemionoView Answer on Stackoverflow
Solution 5 - FilehghView Answer on Stackoverflow
Solution 6 - FileThorView Answer on Stackoverflow
Solution 7 - Filestack0114106View Answer on Stackoverflow
Solution 8 - FileJimBobView Answer on Stackoverflow
Solution 9 - FiledelucasvbView Answer on Stackoverflow
Solution 10 - FileAzizView Answer on Stackoverflow
Solution 11 - FileCristianView Answer on Stackoverflow