如何使用systemctl仅获取单位名称?

如何使用systemctl仅获取单位名称?

当我做

systemctl list-units --all --state=loaded

我得到每个单元的输出,列为

UNIT     LOAD   ACTIVE   SUB       DESCRIPTION  

我只需要UNIT输入输出。

我尝试添加--property=UNIT,但它仍然打印所有列。试过了--output=json-pretty,没成功。

我必须匹配输出中的特定单位,但我的正则表达式失败,因此如果我只获得单位列表,那么比较字符串会很容易,这会很有帮助。

我正在使用的正则表达式是fgrep "input_from_user".service

关于正则表达式或命令有什么建议吗?

答案1

获得 JSON 输出后,您可以使用jqPython 或任何能够理解 JSON 的工具。例如,使用过滤jq

systemctl list-units --output json |
  jq -r --arg pattern input_from_user '.[].unit | select(test($pattern))'

这没有记录,但是这是 2020 年 5 月添加的作为将表格输出转换为 JSON 的一般功能; agit grep output_table表示它应该适用于list-units,list-unit-fileslist-machines

例子:

% systemctl list-units --output json | jq -r --arg pattern network '.[].unit | select(test($pattern))'
network-online.target
network.target

答案2

试试这个单线:

systemctl show '*' --state=loaded --property=Id --value --no-pager | grep . | sort | uniq

解释

  • systemctl提供show命令
    • '*'选择所有单位(据我观察)。没有的话'*'systemctl show只会展示systemd 管理器本身的信息,而不是其管理的单元的信息。
    • --state=loaded仅选择那些单位哪些在已加载状态,如您的问题所指定(...每个选定单元的负载状态可以通过添加添加到输出中--property=LoadState
    • --property=Id添加了单位名称 ( Id)到输出(另见--property文档)。
    • --value删除属性从输出中,仅显示属性价值观(即,Id=foo.service变成foo.service
    • --no-pager指示systemctl不要使用寻呼机(...添加以防万一systemctl没有注意到它会自动在管道中使用)
  • systemctl show ...然后将其输出通过管道传输... | grep . | sort | uniq
    • grep .过滤掉任何空的换行符。这使得下游处理更加稳健
    • sort按字母顺序对所有单位名称进行排序
    • uniq确保每个单位名称最多列出一次(添加以防万一)。

相关内容