[Crash-utility] [PATCH] add option -E for foreach
Dave Anderson
anderson at redhat.com
Wed Feb 29 15:28:42 UTC 2012
----- Original Message -----
> Hello Dave,
>
> I have modified my patch. In my opinion, regular expression should not
> mix with other task-identifying arguments, so I made some more
> modifications
Why not? It would be far more useful if you could maintain
the current capability of providing a mixture of pid/task/name
task-identifiers along with this new regular-expression-matching
scheme.
Dave
>
> At 2012-2-29 1:01, Dave Anderson wrote:
> >
> >
> > ----- Original Message -----
> >> Hello Dave,
> >>
> >> The patch is used to add a new option, "-E regex", to perform the
> >> command(s) on all commands whose names contains a match to "regex".
> >> "regex" is interpreted as an POSIX extended regular expression.
> >>
> >> The new option is helpful when using to search some commands whose names
> >> are similar. And I think it is more reliable than "foreach<name>
> >> <command> | grep xxx", for information comes from command may have a
> >> match to "xxx".
> >>
> >> P.S.
> >> The patch uses some function defined in regex.h, which is offered by glibc.
> >
> > The concept is a pretty good idea. However:
> >
> > (1) It doesn't work as you've described it in the help page, and
> > (2) I don't like the invocation, because option characters are
> > meant to be passed to the selected command, and not for
> > consumption by the foreach command itself.
> >
> > With respect to (1), your help page example shows this:
> >
> > crash> help foreach
> > ... [ cut ] ...
> > Display the state of tasks whose name contains a match to
> > 'event.*':
> >
> > crash> foreach -E 'event.*' task -R state
> > PID: 99 TASK: ffff8804750d5500 CPU: 0 COMMAND: "events/0"
> > state = 1,
> >
> > PID: 100 TASK: ffff8804750d4ac0 CPU: 1 COMMAND: "events/1"
> > state = 1,
> >
> > PID: 101 TASK: ffff8804750d4080 CPU: 2 COMMAND: "events/2"
> > state = 1,
> > ...
> >
> > But your example doesn't work with the encompassing "'" characters:
> >
> > crash> foreach -E 'event.*' task -R state
> > crash>
> >
> > If I remove the encompassing "'" characters, it does work:
> >
> > crash> foreach -E event.* task -R state
> > PID: 67 TASK: ffff88033833d500 CPU: 0 COMMAND: "events/0"
> > state = 1,
> >
> > PID: 68 TASK: ffff88033833cac0 CPU: 1 COMMAND: "events/1"
> > state = 1,
> >
> > PID: 69 TASK: ffff88033833c080 CPU: 2 COMMAND: "events/2"
> > state = 1,
> >
> > PID: 70 TASK: ffff880338367540 CPU: 3 COMMAND: "events/3"
> > state = 1,
> >
> > ...
> >
> > So apparently regcomp() does not handle strings encompassed with
> > the "'" characters.
> >
> > With respect to (2), however, since the process name option already
> > has the "\" invocation option to prevent ambiguity with the foreach
> > command name:
> >
> > crash> help foreach
> > ...
> > name perform the command(s) on all commands with this name. If the
> > command name can be confused with a foreach command name, then
> > precede the name string with a "\".
> > ...
> >
> > Perhaps there can be a third way of specifying the "name" option, where a
> > regular expression *must* be encompassed by "'" characters, and therefore:
> >
> > (a) the argument can be recognized as a POSIX expression, and
> > (b) the encompassing "'" characters can be stripped off before passing the
> > argument string to regcomp().
> >
> > So then you could simply enter:
> >
> > crash> foreach 'event.*' task -R state
> >
> > And have it described in the help page something like:
> >
> > crash> help foreach
> > ...
> > name perform the command(s) on all processes with this name. If the
> > process name can be confused with a foreach command name, then
> > precede the name string with a "\". If the process name is
> > enclosed within "'" characters, then the encompassed string
> > is a POSIX extended regular expression that will be used to
> > match process names.
> > ...
> >
> > Then you can simplify things by replacing the FOREACH_E_FLAG usage with
> > a FOREACH_REGEX flag that can be set in cmd_foreach() and checked
> > in foreach().
> >
> > Dave
More information about the Crash-utility
mailing list