summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Ledbetter <timledbetter@gmail.com>2023-05-30 17:51:30 +0100
committerAndreas Kling <kling@serenityos.org>2023-05-31 06:04:48 +0200
commitf5da6d61b43e38b02c22b35f074966c1a36cd797 (patch)
treecd2047bdd54243ba625c9e205eb2dd588644e143
parent821bf5e071f3d9b44fffa7c632d24830e3833ff2 (diff)
downloadserenity-f5da6d61b43e38b02c22b35f074966c1a36cd797.zip
pgrep: Add `-x` option to only select exact matches
-rw-r--r--Base/usr/share/man/man1/pgrep.md4
-rw-r--r--Userland/Utilities/pgrep.cpp8
2 files changed, 10 insertions, 2 deletions
diff --git a/Base/usr/share/man/man1/pgrep.md b/Base/usr/share/man/man1/pgrep.md
index 5d4b224b0b..76d2e0d434 100644
--- a/Base/usr/share/man/man1/pgrep.md
+++ b/Base/usr/share/man/man1/pgrep.md
@@ -5,7 +5,7 @@ pgrep - look up processes based on name
## Synopsis
```sh
-$ pgrep [--count] [-d delimiter] [--ignore-case] [--list-name] [--uid uid-list] [--invert-match] <process-name>
+$ pgrep [--count] [-d delimiter] [--ignore-case] [--list-name] [--uid uid-list] [--invert-match] [--exact] <process-name>
```
## Options
@@ -15,7 +15,7 @@ $ pgrep [--count] [-d delimiter] [--ignore-case] [--list-name] [--uid uid-list]
* `-i`, `--ignore-case`: Make matches case-insensitive
* `-l`, `--list-name`: List the process name in addition to its pid
* `-U uid-list`, `--uid uid-list`: Select only processes whose UID is in the given comma-separated list. Login name or numerical user ID may be used
-
+* `-x`, `--exact`: Select only processes whose names match the given pattern exactly
* `-v`, `--invert-match`: Select non-matching lines
## Arguments
diff --git a/Userland/Utilities/pgrep.cpp b/Userland/Utilities/pgrep.cpp
index ce0ca0698a..9bf0212ab4 100644
--- a/Userland/Utilities/pgrep.cpp
+++ b/Userland/Utilities/pgrep.cpp
@@ -27,6 +27,7 @@ ErrorOr<int> serenity_main(Main::Arguments args)
bool case_insensitive = false;
bool list_process_name = false;
bool invert_match = false;
+ bool exact_match = false;
HashTable<uid_t> uids_to_filter_by;
StringView pattern;
@@ -60,6 +61,7 @@ ErrorOr<int> serenity_main(Main::Arguments args)
},
});
args_parser.add_option(invert_match, "Select non-matching lines", "invert-match", 'v');
+ args_parser.add_option(exact_match, "Select only processes whose names match the given pattern exactly", "exact", 'x');
args_parser.add_positional_argument(pattern, "Process name to search for", "process-name");
args_parser.parse(args);
@@ -67,6 +69,12 @@ ErrorOr<int> serenity_main(Main::Arguments args)
if (case_insensitive)
options |= PosixFlags::Insensitive;
+ StringBuilder exact_pattern_builder;
+ if (exact_match) {
+ exact_pattern_builder.appendff("^({})$", pattern);
+ pattern = exact_pattern_builder.string_view();
+ }
+
Regex<PosixExtended> re(pattern, options);
if (re.parser_result.error != regex::Error::NoError) {
return 1;