journalctl: fix output when --lines is used with --grep

Previously, we skip the entries before arg_lines
unconditionally, which doesn't behave correctly
when used with --grep. After this commit, when
a pattern is specified, we don't skip the entries
early, but rely on the count of the lines shown
to tell us when to stop. To achieve that we would
have to search backwards instead.

Fixes #25147
This commit is contained in:
Mike Yuan 2023-02-18 21:49:21 +08:00 committed by Yu Watanabe
parent 2421dd7267
commit db4691961c
2 changed files with 11 additions and 2 deletions

View file

@ -363,7 +363,9 @@
<para>If the pattern is all lowercase, matching is case insensitive. Otherwise, matching is case
sensitive. This can be overridden with the <option>--case-sensitive</option> option, see
below.</para></listitem>
below.</para>
<para>When used with <option>--lines=</option>, <option>--reverse</option> is implied.</para></listitem>
</varlistentry>
<varlistentry>
@ -540,7 +542,9 @@
<listitem><para>Show the most recent journal events and limit the number of events shown. If
<option>--follow</option> is used, this option is implied. The argument is a positive integer or
<literal>all</literal> to disable line limiting. The default value is 10 if no argument is
given.</para></listitem>
given.</para>
<para>When used with <option>--grep=</option>, <option>--reverse</option> is implied.</para></listitem>
</varlistentry>
<varlistentry>

View file

@ -1084,6 +1084,11 @@ static int parse_argv(int argc, char *argv[]) {
r = pattern_compile_and_log(arg_pattern, arg_case, &arg_compiled_pattern);
if (r < 0)
return r;
/* When --grep is used along with --lines, we don't know how many lines we can print.
* So we search backwards and count until enough lines have been printed or we hit the head. */
if (arg_lines >= 0)
arg_reverse = true;
}
return 1;