当我做
systemctl list-units --all --state=loaded
我得到每个单元的输出,列为
UNIT LOAD ACTIVE SUB DESCRIPTION
我只需要UNIT
输入输出。
我尝试添加--property=UNIT
,但它仍然打印所有列。试过了--output=json-pretty
,没成功。
我必须匹配输出中的特定单位,但我的正则表达式失败,因此如果我只获得单位列表,那么比较字符串会很容易,这会很有帮助。
我正在使用的正则表达式是fgrep "input_from_user".service
关于正则表达式或命令有什么建议吗?
答案1
获得 JSON 输出后,您可以使用jq
Python 或任何能够理解 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-files
和list-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
确保每个单位名称最多列出一次(添加以防万一)。