Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get last line of shell output as a variable

I am working on a shell script with exiftool to automatically change some exif tags on pictures contained in a certain folder and I would like to use the output to get a notification on my NAS (a QNAP) when the job is completed.

Everything works already, but - as the notification system truncates the message - I would like to receive just the information I need, i.e. the last line of the shell output, which is for example the following:

Warning: [minor] Entries in IFD0 were out of sequence. Fixed. - 2015-07-12 15.41.06.jpg                                                                               4512 files failed condition                                                         177 image files updated 

The problem is that currently I only receive the following notification:

Exiftool cronjob completed on Camera: 4512 files failed condition

What I would like to get instead is:

Exiftool cronjob completed on Camera: 177 image files updated

The script is the following:

#!/bin/sh # exiftool script for 2002 problem dir="/share/Multimedia/Camera" cd "$dir" FOLDER="$(printf '%s\n' "${PWD##*/}")" OUTPUT="$(exiftool -overwrite_original -r '-CreateDate<DateTimeOriginal' -if '$CreateDate eq "2002:12:08 12:00:00"' -if '$DateTimeOriginal ne $CreateDate' *.[Jj][Pp][Gg])" /sbin/notice_log_tool -a "Exiftool cronjob completed on ${FOLDER}: ${OUTPUT}" --severity=5 exit 0 

To do that I played with the $OUTPUT variable using | tail -1, but probably I make some basic errors and I receive something like:

Exiftool cronjob completed on Camera: 4512 files failed condition | tail -1

How to do it in the right way? Thanks

like image 582
giopas Avatar asked Jul 13 '15 10:07

giopas


People also ask

How do I get the last line of a shell?

To look at the last few lines of a file, use the tail command. tail works the same way as head: type tail and the filename to see the last 10 lines of that file, or type tail -number filename to see the last number lines of the file.

How do I get the last line in bash?

${str##*$'\n'} will remove the longest match till \n from start of the string thus leaving only the last line in input.

How do I display the last line of a file?

Use the tail command to write the file specified by the File parameter to standard output beginning at a specified point. This displays the last 10 lines of the accounts file. The tail command continues to display lines as they are added to the accounts file.


2 Answers

Put the tail inside the capturing parens.

OUTPUT=$(exif ... | tail -1) 

You don't need the double quotes here. I'm guessing that you tried

OUTPUT="$(exif ...) | tail -1" 
like image 147
user464502 Avatar answered Oct 19 '22 03:10

user464502


Probably an old post to be answering now, but try using the -n flag (see tail --help) and wrap the command output using ticks.

OUTPUT=`exif ... | tail -n 1` 

(user464502's answer did not work for me as the tail command does not recognize the parameter "-1")

like image 43
IanK.CO Avatar answered Oct 19 '22 05:10

IanK.CO