удалите пустые строки

Я мог нуждаться в некоторой помощи с коротким сценарием, который я создаю. Сценарий должен дать мне список сервисов, которые работают на существующей системе. Я хотел понять это с 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                                                

Я хотел бы удалить вакуумы. После некоторого исследования Google я нашел некоторые решения с TR (как 'TR-d ""' или 'TR-s ""'), но это, кажется, не работает. Я даже попробовал некоторые решения grep или sed, но ни один из них не помог мне wih это.

править: следующие решения я попробовал без успеха: | grep"." | sed '/^ $/d | grep "\S"

Некоторая справка была бы большой!Спасибо

0
задан 1 April 2020 в 11:09

3 ответа

Можно попробовать что-то вроде этого: systemctl list-units --type service | grep -f /etc/update-motd.d/service.list | grep -v ^$ Это должно удалить любые emtpy строки

0
ответ дан 7 April 2020 в 23:22

Используя tr сжимать новые строки:

$ systemctl list-units --type service | \
  grep -f <(tr < /etc/update-motd.d/service.list -s \\n)
0
ответ дан 7 April 2020 в 23:22

Что Вы видите, не пустые строки - они долго запаздывают последовательности пробелов, которые, кажется, часть 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 переменная среды), но я не могу найти его.

0
ответ дан 7 April 2020 в 23:22

Другие вопросы по тегам:

Похожие вопросы: