From ad851706ab434abf1cccd94955d919747f86a987 Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Tue, 30 May 2023 17:51:18 +0100 Subject: [PATCH] pgrep: Add `-c` option to show the number of matches --- Base/usr/share/man/man1/pgrep.md | 3 ++- Userland/Utilities/pgrep.cpp | 27 ++++++++++++++++----------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/Base/usr/share/man/man1/pgrep.md b/Base/usr/share/man/man1/pgrep.md index 235d90045b..23a8d41403 100644 --- a/Base/usr/share/man/man1/pgrep.md +++ b/Base/usr/share/man/man1/pgrep.md @@ -5,11 +5,12 @@ pgrep - look up processes based on name ## Synopsis ```sh -$ pgrep [-d delimiter] [--ignore-case] [--invert-match] +$ pgrep [--count] [-d delimiter] [--ignore-case] [--invert-match] ``` ## Options +* `-c`, `--count`: Suppress normal output and print the number of matching processes * `-d`, `--delimiter`: Set the string used to delimit multiple pids * `-i`, `--ignore-case`: Make matches case-insensitive * `-v`, `--invert-match`: Select non-matching lines diff --git a/Userland/Utilities/pgrep.cpp b/Userland/Utilities/pgrep.cpp index 4c7fa0b29c..5cc16839dc 100644 --- a/Userland/Utilities/pgrep.cpp +++ b/Userland/Utilities/pgrep.cpp @@ -20,12 +20,14 @@ ErrorOr serenity_main(Main::Arguments args) TRY(Core::System::unveil("/etc/passwd", "r")); TRY(Core::System::unveil(nullptr, nullptr)); + bool display_number_of_matches = false; auto pid_delimiter = "\n"sv; bool case_insensitive = false; bool invert_match = false; StringView pattern; Core::ArgsParser args_parser; + args_parser.add_option(display_number_of_matches, "Suppress normal output and print the number of matching processes", "count", 'c'); args_parser.add_option(pid_delimiter, "Set the string used to delimit multiple pids", "delimiter", 'd', nullptr); args_parser.add_option(case_insensitive, "Make matches case-insensitive", "ignore-case", 'i'); args_parser.add_option(invert_match, "Select non-matching lines", "invert-match", 'v'); @@ -51,20 +53,23 @@ ErrorOr serenity_main(Main::Arguments args) } } - quick_sort(matches); + if (display_number_of_matches) { + outln("{}", matches.size()); + } else { + quick_sort(matches); + auto displayed_at_least_one = false; + for (auto& match : matches) { + if (displayed_at_least_one) + out("{}{}"sv, pid_delimiter, match); + else + out("{}"sv, match); + + displayed_at_least_one = true; + } - auto displayed_at_least_one = false; - for (auto& match : matches) { if (displayed_at_least_one) - out("{}{}"sv, pid_delimiter, match); - else - out("{}"sv, match); - - displayed_at_least_one = true; + outln(); } - if (displayed_at_least_one) - outln(); - return matches.size() > 0 ? 0 : 1; }