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に変換する一般的な機能は、で動作する必要がgit grep output_tableあることを意味します。list-unitslist-unit-fileslist-machines

例:

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

答え2

次の1行で試してください。

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

説明する

  • systemctlshowコマンド提供:
    • '*'(私の観察によると)すべての単位を選択してください。そうでない'*'場合systemctl showのみ展示する管理するデバイスではなく、システム管理者自体に関する情報です。
    • --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各ユニット名が最大1回だけリストされていることを確認してください(もしそうならば追加)。

関連情報