[PATCH] tailf: add option -n fo specifying output lines

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



It will be useful if we can print out the last n lines instead of the last
10, just like tail.

There are examples:

tailf -n 5 file1
tailf --lines 10 file2
tailf -20 file3

Signed-off-by: Li Zefan <lizf@xxxxxxxxxxxxxx>
---
 tailf.1 |   14 +++++++++-----
 tailf.c |   48 +++++++++++++++++++++++++++++++++---------------
 2 files changed, 42 insertions(+), 20 deletions(-)

diff --git a/text-utils/tailf.1 b/text-utils/tailf.1
index ccce662..8bc53fc 100644
--- a/text-utils/tailf.1
+++ b/text-utils/tailf.1
@@ -26,7 +26,8 @@
 .SH NAME
 tailf \- follow the growth of a log file
 .SH SYNOPSIS
-.BI tailf " file"
+.B tailf
+[\fIOPTION\fR] \fIfile\fR
 .SH DESCRIPTION
 .B tailf
 will print out the last 10 lines of a file and then wait for the file to
@@ -40,10 +41,13 @@ does not occur periodically when no log activity is happening.
 is extremely useful for monitoring log files on a laptop when logging is
 infrequent and the user desires that the hard disk spin down to conserve
 battery life.
-.SH BUGS
-An option could be provided to print out the last
-.I n
-lines instead of the last 10.
+.PP
+Mandatory arguments to long options are mandatory for short options too.
+.TP
+\fB\-n\fR, \fB\-\-lines\fR=\fIN\fR, \fB\-N\fR
+output the last
+.I N
+lines, instead of the last 10.
 .SH AUTHOR
 This program was written by Rik Faith (faith@xxxxxxx) and may be freely
 distributed under the terms of the X11/MIT License.  There is ABSOLUTELY
diff --git a/text-utils/tailf.c b/text-utils/tailf.c
index e10243f..3fbe849 100644
--- a/text-utils/tailf.c
+++ b/text-utils/tailf.c
@@ -31,8 +31,11 @@
 #include <unistd.h>
 #include <malloc.h>
 #include <sys/stat.h>
+#include "errs.h"
 #include "nls.h"
 
+#define DEFAULT_LINES	10
+
 static size_t filesize(const char *filename)
 {
     struct stat sb;
@@ -50,9 +53,7 @@ static void tailf(const char *filename, int lines)
     int  i;
 
     if (!(str = fopen(filename, "r"))) {
-	fprintf(stderr, _("Cannot open \"%s\" for read\n"), filename);
-	perror("");
-	exit(1);
+	err(EXIT_FAILURE, "Cannot open %s for read", filename);
     }
 
     buffer = malloc(lines * sizeof(*buffer));
@@ -84,28 +85,45 @@ int main(int argc, char **argv)
     FILE       *str;
     const char *filename;
     int        count;
+    int        lines = DEFAULT_LINES;
 
     setlocale(LC_ALL, "");
     bindtextdomain(PACKAGE, LOCALEDIR);
     textdomain(PACKAGE);
 
-    if (argc != 2) {
-	fprintf(stderr, _("Usage: tailf logfile\n"));
-	exit(1);
-    }
+	argc--;
+	argv++;
 
-    filename = argv[1];
+	for (; argc > 0 && argv[0][0] == '-'; argc--, argv++) {
+		if (!strcmp(*argv, "-n") || !strcmp(*argv, "--lines")) {
+			argc--;
+			argv++;
+			if (argc > 0 && (lines = atoi(argv[0])) <= 0)
+				errx(EXIT_FAILURE, _("Invalid number of lines"));
+		}
+		else if (isdigit(argv[0][1])) {
+			if ((lines = atoi(*argv + 1)) <= 0)
+				errx(EXIT_FAILURE, _("Invalid number of lines"));
+		}
+		else
+			errx(EXIT_FAILURE, _("Invalid option"));
+	}	
+
+	if (argc != 1) {
+		fprintf(stderr, _("Usage: tailf [-n N | -N] logfile\n"));
+		exit(EXIT_FAILURE);
+	}
 
-    tailf(filename, 10);
+    filename = argv[0];
+
+    tailf(filename, lines);
 
     for (osize = filesize(filename);;) {
 	nsize = filesize(filename);
 	if (nsize != osize) {
-	    if (!(str = fopen(filename, "r"))) {
-		fprintf(stderr, _("Cannot open \"%s\" for read\n"), filename);
-		perror(argv[0]);
-		exit(1);
-	    }
+	    if (!(str = fopen(filename, "r")))
+		err(EXIT_FAILURE, "Cannot open %s for read", filename);
+
 	    if (!fseek(str, osize, SEEK_SET))
                 while ((count = fread(buffer, 1, sizeof(buffer), str)) > 0)
                     fwrite(buffer, 1, count, stdout);
@@ -115,5 +133,5 @@ int main(int argc, char **argv)
 	}
 	usleep(250000);		/* 250mS */
     }
-    return 0;
+    return EXIT_SUCCESS;
 }
---


-
To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux