删除空行

删除空行

我需要一些帮助来构建一个单行脚本。该脚本应该为我提供当前系统上运行的服务列表。我想用 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环境变量),但我找不到它。

相关内容