Add -t to pcre2grep.
This commit is contained in:
parent
3938a5b7f3
commit
1828179ef9
|
@ -78,6 +78,8 @@ this situation and does not try to use JIT.
|
||||||
(untested by me). Also, look for GREP_COLOUR or GREP_COLOR if the environment
|
(untested by me). Also, look for GREP_COLOUR or GREP_COLOR if the environment
|
||||||
variables PCRE2GREP_COLOUR and PCRE2GREP_COLOR are not found.
|
variables PCRE2GREP_COLOUR and PCRE2GREP_COLOR are not found.
|
||||||
|
|
||||||
|
14. Add the -t (grand total) option to pcre2grep.
|
||||||
|
|
||||||
|
|
||||||
Version 10.22 29-July-2016
|
Version 10.22 29-July-2016
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
24
RunGrepTest
24
RunGrepTest
|
@ -568,6 +568,30 @@ echo "---------------------------- Test 112 -----------------------------" >>tes
|
||||||
(cd $srcdir; $valgrind $vjs $pcre2grep --file-offsets -M 'match (\d+):\n (.)\n' testdata/grepinput) >>testtrygrep
|
(cd $srcdir; $valgrind $vjs $pcre2grep --file-offsets -M 'match (\d+):\n (.)\n' testdata/grepinput) >>testtrygrep
|
||||||
echo "RC=$?" >>testtrygrep
|
echo "RC=$?" >>testtrygrep
|
||||||
|
|
||||||
|
echo "---------------------------- Test 113 -----------------------------" >>testtrygrep
|
||||||
|
(cd $srcdir; $valgrind $vjs $pcre2grep --total-count 'the' testdata/grepinput*) >>testtrygrep
|
||||||
|
echo "RC=$?" >>testtrygrep
|
||||||
|
|
||||||
|
echo "---------------------------- Test 114 -----------------------------" >>testtrygrep
|
||||||
|
(cd $srcdir; $valgrind $vjs $pcre2grep -tc 'the' testdata/grepinput*) >>testtrygrep
|
||||||
|
echo "RC=$?" >>testtrygrep
|
||||||
|
|
||||||
|
echo "---------------------------- Test 115 -----------------------------" >>testtrygrep
|
||||||
|
(cd $srcdir; $valgrind $vjs $pcre2grep -tlc 'the' testdata/grepinput*) >>testtrygrep
|
||||||
|
echo "RC=$?" >>testtrygrep
|
||||||
|
|
||||||
|
echo "---------------------------- Test 116 -----------------------------" >>testtrygrep
|
||||||
|
(cd $srcdir; $valgrind $vjs $pcre2grep -th 'the' testdata/grepinput*) >>testtrygrep
|
||||||
|
echo "RC=$?" >>testtrygrep
|
||||||
|
|
||||||
|
echo "---------------------------- Test 117 -----------------------------" >>testtrygrep
|
||||||
|
(cd $srcdir; $valgrind $vjs $pcre2grep -tch 'the' testdata/grepinput*) >>testtrygrep
|
||||||
|
echo "RC=$?" >>testtrygrep
|
||||||
|
|
||||||
|
echo "---------------------------- Test 118 -----------------------------" >>testtrygrep
|
||||||
|
(cd $srcdir; $valgrind $vjs $pcre2grep -tL 'the' testdata/grepinput*) >>testtrygrep
|
||||||
|
echo "RC=$?" >>testtrygrep
|
||||||
|
|
||||||
# Now compare the results.
|
# Now compare the results.
|
||||||
|
|
||||||
$cf $srcdir/testdata/grepoutput testtrygrep
|
$cf $srcdir/testdata/grepoutput testtrygrep
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.TH PCRE2GREP 1 "14 October 2016" "PCRE2 10.23"
|
.TH PCRE2GREP 1 "16 October 2016" "PCRE2 10.23"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
pcre2grep - a grep with Perl-compatible regular expressions.
|
pcre2grep - a grep with Perl-compatible regular expressions.
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
@ -180,13 +180,15 @@ This is equivalent to setting both \fB-A\fP and \fB-B\fP to the same value.
|
||||||
.TP
|
.TP
|
||||||
\fB-c\fP, \fB--count\fP
|
\fB-c\fP, \fB--count\fP
|
||||||
Do not output lines from the files that are being scanned; instead output the
|
Do not output lines from the files that are being scanned; instead output the
|
||||||
number of matches (or non-matches if \fB-v\fP is used) that would otherwise
|
number of lines that would have been shown, either because they matched, or, if
|
||||||
have caused lines to be shown. By default, this count is the same as the number
|
\fB-v\fP is set, because they failed to match. By default, this count is
|
||||||
of suppressed lines, but if the \fB-M\fP (multiline) option is used (without
|
exactly the same as the number of suppressed lines, but if the \fB-M\fP
|
||||||
\fB-v\fP), there may be more suppressed lines than the number of matches.
|
(multiline) option is used (without \fB-v\fP), there may be more suppressed
|
||||||
|
lines than the number of matches.
|
||||||
.sp
|
.sp
|
||||||
If no lines are selected, the number zero is output. If several files are are
|
If no lines are selected, the number zero is output. If several files are are
|
||||||
being scanned, a count is output for each of them. However, if the
|
being scanned, a count is output for each of them and the \fB-t\fP option can
|
||||||
|
be used to cause a total to be output at the end. However, if the
|
||||||
\fB--files-with-matches\fP option is also used, only those files whose counts
|
\fB--files-with-matches\fP option is also used, only those files whose counts
|
||||||
are greater than zero are listed. When \fB-c\fP is used, the \fB-A\fP,
|
are greater than zero are listed. When \fB-c\fP is used, the \fB-A\fP,
|
||||||
\fB-B\fP, and \fB-C\fP options are ignored.
|
\fB-B\fP, and \fB-C\fP options are ignored.
|
||||||
|
@ -573,6 +575,17 @@ Suppress error messages about non-existent or unreadable files. Such files are
|
||||||
quietly skipped. However, the return code is still 2, even if matches were
|
quietly skipped. However, the return code is still 2, even if matches were
|
||||||
found in other files.
|
found in other files.
|
||||||
.TP
|
.TP
|
||||||
|
\fB-t\fP, \fB--total-count\fP
|
||||||
|
This option is useful when scanning more than one file. If used on its own,
|
||||||
|
\fB-t\fP suppresses all output except for a grand total number of matching
|
||||||
|
lines (or non-matching lines if \fB-v\fP is used) in all the files. If \fB-t\fP
|
||||||
|
is used with \fB-c\fP, a grand total is output except when the previous output
|
||||||
|
is just one line. In other words, it is not output when just one file's count
|
||||||
|
is listed. If file names are being output, the grand total is preceded by
|
||||||
|
"TOTAL:". Otherwise, it appears as just another number. The \fB-t\fP option is
|
||||||
|
ignored when used with \fB-L\fP (list files without matches), because the grand
|
||||||
|
total would always be zero.
|
||||||
|
.TP
|
||||||
\fB-u\fP, \fB--utf-8\fP
|
\fB-u\fP, \fB--utf-8\fP
|
||||||
Operate in UTF-8 mode. This option is available only if PCRE2 has been compiled
|
Operate in UTF-8 mode. This option is available only if PCRE2 has been compiled
|
||||||
with UTF-8 support. All patterns (including those for any \fB--exclude\fP and
|
with UTF-8 support. All patterns (including those for any \fB--exclude\fP and
|
||||||
|
@ -778,6 +791,6 @@ Cambridge, England.
|
||||||
.rs
|
.rs
|
||||||
.sp
|
.sp
|
||||||
.nf
|
.nf
|
||||||
Last updated: 14 October 2016
|
Last updated: 16 October 2016
|
||||||
Copyright (c) 1997-2016 University of Cambridge.
|
Copyright (c) 1997-2016 University of Cambridge.
|
||||||
.fi
|
.fi
|
||||||
|
|
|
@ -177,6 +177,8 @@ static int bufthird = PCRE2GREP_BUFSIZE;
|
||||||
static int max_bufthird = PCRE2GREP_MAX_BUFSIZE;
|
static int max_bufthird = PCRE2GREP_MAX_BUFSIZE;
|
||||||
static int bufsize = 3*PCRE2GREP_BUFSIZE;
|
static int bufsize = 3*PCRE2GREP_BUFSIZE;
|
||||||
static int endlinetype;
|
static int endlinetype;
|
||||||
|
static int total_count = 0;
|
||||||
|
static int counts_printed = 0;
|
||||||
|
|
||||||
#if defined HAVE_WINDOWS_H && HAVE_WINDOWS_H
|
#if defined HAVE_WINDOWS_H && HAVE_WINDOWS_H
|
||||||
static int dee_action = dee_SKIP;
|
static int dee_action = dee_SKIP;
|
||||||
|
@ -218,6 +220,7 @@ static BOOL omit_zero_count = FALSE;
|
||||||
static BOOL resource_error = FALSE;
|
static BOOL resource_error = FALSE;
|
||||||
static BOOL quiet = FALSE;
|
static BOOL quiet = FALSE;
|
||||||
static BOOL show_only_matching = FALSE;
|
static BOOL show_only_matching = FALSE;
|
||||||
|
static BOOL show_total_count = FALSE;
|
||||||
static BOOL silent = FALSE;
|
static BOOL silent = FALSE;
|
||||||
static BOOL utf = FALSE;
|
static BOOL utf = FALSE;
|
||||||
|
|
||||||
|
@ -402,6 +405,7 @@ static option_item optionlist[] = {
|
||||||
{ OP_OP_NUMBER, 'S', &S_arg, "jeffS", "replace matched (sub)string with X" },
|
{ OP_OP_NUMBER, 'S', &S_arg, "jeffS", "replace matched (sub)string with X" },
|
||||||
#endif
|
#endif
|
||||||
{ OP_NODATA, 's', NULL, "no-messages", "suppress error messages" },
|
{ OP_NODATA, 's', NULL, "no-messages", "suppress error messages" },
|
||||||
|
{ OP_NODATA, 't', NULL, "total-count", "print total count of matching lines" },
|
||||||
{ OP_NODATA, 'u', NULL, "utf", "use UTF mode" },
|
{ OP_NODATA, 'u', NULL, "utf", "use UTF mode" },
|
||||||
{ OP_NODATA, 'V', NULL, "version", "print version information and exit" },
|
{ OP_NODATA, 'V', NULL, "version", "print version information and exit" },
|
||||||
{ OP_NODATA, 'v', NULL, "invert-match", "select non-matching lines" },
|
{ OP_NODATA, 'v', NULL, "invert-match", "select non-matching lines" },
|
||||||
|
@ -2115,7 +2119,7 @@ while (ptr < endptr)
|
||||||
|
|
||||||
/* Just count if just counting is wanted. */
|
/* Just count if just counting is wanted. */
|
||||||
|
|
||||||
else if (count_only) count++;
|
else if (count_only || show_total_count) count++;
|
||||||
|
|
||||||
/* When handling a binary file and binary-files==binary, the "binary"
|
/* When handling a binary file and binary-files==binary, the "binary"
|
||||||
variable will be set true (it's false in all other cases). In this
|
variable will be set true (it's false in all other cases). In this
|
||||||
|
@ -2458,7 +2462,7 @@ while (ptr < endptr)
|
||||||
/* End of file; print final "after" lines if wanted; do_after_lines sets
|
/* End of file; print final "after" lines if wanted; do_after_lines sets
|
||||||
hyphenpending if it prints something. */
|
hyphenpending if it prints something. */
|
||||||
|
|
||||||
if (!show_only_matching && !count_only)
|
if (!show_only_matching && !(count_only|show_total_count))
|
||||||
{
|
{
|
||||||
do_after_lines(lastmatchnumber, lastmatchrestart, endptr, printname);
|
do_after_lines(lastmatchnumber, lastmatchrestart, endptr, printname);
|
||||||
hyphenpending |= endhyphenpending;
|
hyphenpending |= endhyphenpending;
|
||||||
|
@ -2482,9 +2486,11 @@ if (count_only && !quiet)
|
||||||
if (printname != NULL && filenames != FN_NONE)
|
if (printname != NULL && filenames != FN_NONE)
|
||||||
fprintf(stdout, "%s:", printname);
|
fprintf(stdout, "%s:", printname);
|
||||||
fprintf(stdout, "%d" STDOUT_NL, count);
|
fprintf(stdout, "%d" STDOUT_NL, count);
|
||||||
|
counts_printed++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
total_count += count; /* Can be set without count_only */
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2793,6 +2799,7 @@ switch(letter)
|
||||||
case 'q': quiet = TRUE; break;
|
case 'q': quiet = TRUE; break;
|
||||||
case 'r': dee_action = dee_RECURSE; break;
|
case 'r': dee_action = dee_RECURSE; break;
|
||||||
case 's': silent = TRUE; break;
|
case 's': silent = TRUE; break;
|
||||||
|
case 't': show_total_count = TRUE; break;
|
||||||
case 'u': options |= PCRE2_UTF; utf = TRUE; break;
|
case 'u': options |= PCRE2_UTF; utf = TRUE; break;
|
||||||
case 'v': invert = TRUE; break;
|
case 'v': invert = TRUE; break;
|
||||||
case 'w': process_options |= PO_WORD_MATCH; break;
|
case 'w': process_options |= PO_WORD_MATCH; break;
|
||||||
|
@ -3689,6 +3696,16 @@ for (; i < argc; i++)
|
||||||
else if (frc == 0 && rc == 1) rc = 0;
|
else if (frc == 0 && rc == 1) rc = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Show the total number of matches if requested, but not if only one file's
|
||||||
|
count was printed. */
|
||||||
|
|
||||||
|
if (show_total_count && counts_printed != 1 && filenames != FN_NOMATCH_ONLY)
|
||||||
|
{
|
||||||
|
if (counts_printed != 0 && filenames >= FN_DEFAULT)
|
||||||
|
fprintf(stdout, "TOTAL:");
|
||||||
|
fprintf(stdout, "%d" STDOUT_NL, total_count);
|
||||||
|
}
|
||||||
|
|
||||||
EXIT:
|
EXIT:
|
||||||
#ifdef SUPPORT_PCRE2GREP_JIT
|
#ifdef SUPPORT_PCRE2GREP_JIT
|
||||||
if (jit_stack != NULL) pcre2_jit_stack_free(jit_stack);
|
if (jit_stack != NULL) pcre2_jit_stack_free(jit_stack);
|
||||||
|
|
|
@ -787,3 +787,35 @@ RC=0
|
||||||
37204,12
|
37204,12
|
||||||
37216,12
|
37216,12
|
||||||
RC=0
|
RC=0
|
||||||
|
---------------------------- Test 113 -----------------------------
|
||||||
|
476
|
||||||
|
RC=0
|
||||||
|
---------------------------- Test 114 -----------------------------
|
||||||
|
testdata/grepinput:469
|
||||||
|
testdata/grepinput3:0
|
||||||
|
testdata/grepinput8:0
|
||||||
|
testdata/grepinputv:1
|
||||||
|
testdata/grepinputx:6
|
||||||
|
TOTAL:476
|
||||||
|
RC=0
|
||||||
|
---------------------------- Test 115 -----------------------------
|
||||||
|
testdata/grepinput:469
|
||||||
|
testdata/grepinputv:1
|
||||||
|
testdata/grepinputx:6
|
||||||
|
TOTAL:476
|
||||||
|
RC=0
|
||||||
|
---------------------------- Test 116 -----------------------------
|
||||||
|
476
|
||||||
|
RC=0
|
||||||
|
---------------------------- Test 117 -----------------------------
|
||||||
|
469
|
||||||
|
0
|
||||||
|
0
|
||||||
|
1
|
||||||
|
6
|
||||||
|
476
|
||||||
|
RC=0
|
||||||
|
---------------------------- Test 118 -----------------------------
|
||||||
|
testdata/grepinput3
|
||||||
|
testdata/grepinput8
|
||||||
|
RC=0
|
||||||
|
|
Loading…
Reference in New Issue