Browse Source

pgrep: Add `-x` option to only select exact matches

Tim Ledbetter 2 năm trước cách đây
mục cha
commit
f5da6d61b4
2 tập tin đã thay đổi với 10 bổ sung2 xóa
  1. 2 2
      Base/usr/share/man/man1/pgrep.md
  2. 8 0
      Userland/Utilities/pgrep.cpp

+ 2 - 2
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

+ 8 - 0
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;