我需要一些帮助来构建一个单行脚本。该脚本应该为我提供当前系统上运行的服务列表。我想用 systemctl 来实现这一点。
当前的一行代码如下所示:
systemctl list-units --type service | grep -f /etc/update-motd.d/service.list
但是此命令总是在列出的服务之间创建一个空白行
smbd.service loaded active running Samba SMB Daemon
uuidd.service loaded active running Daemon for generating UUIDs
virtlogd.service loaded active running Virtual machine log manager
zabbix-agent.service loaded active running Zabbix Agent
我想删除空格。经过谷歌搜索,我发现了一些使用 tr 的解决方案(例如“tr -d ""”或“tr -s ""”),但这似乎不起作用。我甚至尝试了一些使用 grep 或 sed 的解决方案,但它们都对我没用。
编辑:我尝试了以下解决方案但没有成功:| grep "." | sed '/^$/d | grep "\S"
能得到一些帮助就太好了!谢谢
答案1
您可以尝试这样的事情:
systemctl list-units --type service | grep -f /etc/update-motd.d/service.list | grep -v ^$
这应该会删除所有空行
答案2
用于tr
压缩换行符:
$ systemctl list-units --type service | \
grep -f <(tr < /etc/update-motd.d/service.list -s \\n)
答案3
您看到的不是空行 - 它们是长尾随空格字符序列,似乎是systemctl
表格输出的一部分:
$ systemctl list-units --type service | grep bluetooth | xxd
00000000: 626c 7565 746f 6f74 682e 7365 7276 6963 bluetooth.servic
00000010: 6520 2020 2020 2020 2020 2020 2020 2020 e
00000020: 2020 2020 2020 2020 2020 2020 2020 2020
00000030: 2020 2020 2020 2020 2020 2020 2020 2020
00000040: 2020 2020 2020 2020 2020 2020 2020 2020
00000050: 2020 2020 2020 2020 2020 6c6f 6164 6564 loaded
00000060: 2061 6374 6976 6520 7275 6e6e 696e 6720 active running
00000070: 426c 7565 746f 6f74 6820 7365 7276 6963 Bluetooth servic
00000080: 6520 2020 2020 2020 2020 2020 2020 2020 e
00000090: 2020 2020 2020 2020 2020 2020 2020 2020
000000a0: 2020 2020 2020 2020 2020 2020 2020 2020
000000b0: 2020 2020 2020 2020 2020 2020 200a .
由于终端换行,它们显示为空行。
你能使用 删除它们tr
,例如通过挤压水平空格:
$ systemctl list-units --type service | tr -s '[:blank:]' | grep -f service.list
bluetooth.service loaded active running Bluetooth service
cron.service loaded active running Regular background program processing daemon
polkit.service loaded active running Authorization Manager
另一种可以更好地保留表格格式的选项是仅删除尾随空格:
$ systemctl list-units --type service | sed 's/ *$//' | grep -f service.list
bluetooth.service loaded active running Bluetooth service
cron.service loaded active running Regular background program processing daemon
polkit.service loaded active running Authorization Manager
那里应该有一种方法来阻止systemctl
尝试格式化输出(或者至少响应COLUMNS
环境变量),但我找不到它。