我正在尝试获取正在运行的服务的列表。我跑了
service --status-all
Run Code Online (Sandbox Code Playgroud)
它会返回类似的东西
[ + ] acpid
[ ? ] alsa-utils
[ + ] apache2
[ + ] atd
[ + ] avahi-daemon
[ ? ] binfmt-support
[ + ] bluetooth
[ - ] bootlogd
[ - ] bootlogs
Run Code Online (Sandbox Code Playgroud)
我尝试 grep 并尝试使用特殊字符。
sudo service --status-all | grep '+'
Run Code Online (Sandbox Code Playgroud)
有什么我可以做的让它正常工作。
我尝试 grep 并尝试使用特殊字符。
与基本的正则表达式(BRE)启用(在没有开关的默认-E,-F或-P),grep的解释加上字符作为文字+。
问题是只有以[ + ]或开头的行[ - ]发送到STDOUT,而以开头的行[ ? ]发送到STDERR。只有 STDOUT 被管道传送到 grep;STDERR 直接打印在终端上。
要获得您期望的输出,请执行以下命令:
service --status-all 2>&1 | grep '+'
Run Code Online (Sandbox Code Playgroud)
2>&1 将 STDERR 发送到 STDOUT,因此 grep 能够对其进行过滤。
由于您仅打印以 开头的行 [ + ] ,因此您不妨过滤掉该部分。为此,您可以使用-o开关仅打印匹配的输出,使用-P开关启用Perl 兼容正则表达式(PCRE) 和后视断言 ( (?<=...)):
service --status-all 2>&1 | grep -Po '(?<= \[\ \+ \] ).*'
Run Code Online (Sandbox Code Playgroud)
请注意,对于 PCRE,您必须使用反斜杠对加号和方括号进行转义。
如果使用sed,则可以使用 BRE 实现相同的结果,无需后视,也不知道确切的空格数:
service --status-all 2>&1 | grep '+' | sed 's/.*] *//'
Run Code Online (Sandbox Code Playgroud)
在这里,BRE .*] *(右括号之前的所有内容,后跟任意数量的空格)被空字符串替换。
| 归档时间: |
|
| 查看次数: |
5768 次 |
| 最近记录: |