как извлечь имена сервисов из файла и сохранить их в чистой версии в файле? [closed]

я пытаюсь понять, как извлечь все имена служб из / etc / services и отправить их в текстовый файл отсортировать их в алфавитном порядке удалить все дубликаты избавиться от пустых строк и ненужных пробелов и указать количество строк

0
задан 10 March 2018 в 12:30

3 ответа

Вот мой sed решение:

</etc/services sed '/^\w/!d;s/\s.*//' | sort -u >out

sed '…' file вместо <file sed '…' возможно, но не предпочтителен, как Stéphane Chazelas объясняет.

Это сначала устранит каждую строку, начинающуюся с чего-то еще, чем словесный символ, затем удалит все из каждой строки, начинающейся с первого пробельного символа, затем вид в алфавитном порядке, и устранит дублирующиеся строки и наконец перенаправит вывод в файл out.

Для получения количества строки этого файла я использовал бы wc:

<out wc -l

Объяснения

  • </etc/services – позволить bash откройте указанный файл, и присваивает его содержание stdin, не имеет значения, если это перенаправление помещается, прежде или после команды, Вы могли бы даже сделать >out sed '…' <in если Вам нравится
  • sed '…' – позволить sed выполните выражения
  • /^\w/!d – не делайте (!) dэлита каждое начало строки (^) с a wсимвол порядка, но каждая строка, которая не соответствует этому критерию
  • s/\s.*// – в каждой строке, sзамените первым соответствием белогоsследуйте по символу и всему (.*) это не следует ни с чем (=, удаляют его),
  • command1 | command2 – позволить bash присвоиться command1stdout к command2stdin
  • sort -u – позволить sort отсортируйте строки в алфавитном порядке и произведите только первое из равного выполнения (-u или --unique)
  • >out – позволить bash перенаправьте stdout в указанный файл
  • wc -l – позволить wc распечатайте новоеlколичества ine
1
ответ дан 30 October 2019 в 07:19

Файл /etc/services похож на это:

# Network services, Internet style
#
# (more comments)

tcpmux    1/tcp     # TCP port service multiplexer
echo      7/tcp
...
discard   9/tcp     sink null
discard   9/udp     sink null
...
ssh       22/tcp    # SSH Remote Login Protocol
...

Таким образом, существуют

  • строки, которые состоят только из комментария
  • строки с запаздывающими комментариями
  • пустые строки
  • дубликаты в первом столбце

Для удаления всех их следующая команда является одним возможным путем:

awk '!/^\s*$/ && !/^\s*#/ {print $1}' /etc/services | sort -u | cat -n

Вывод

 1  acr-nema
 2  afbackup
 3  afmbackup
 4  afpovertcp
 5  afs3-bos
 6  afs3-callback
 7  afs3-errors
...

Объяснение

awk '!/^\s*$/ && !/^\s*#/ {print $1}' /etc/services

В целом, awk читает данный файл (или stdin) и затем выполняет следующее для каждой строки:

condition_for_a_line { commands_when_condition_is_met }    

Мы используем !/^\s*$/ && !/^\s*#/ поскольку условие, что означает строку, не пусто, и строка не запускается с комментария. Когда оба условия соблюдают, первый столбец $1 печатается. Это дает нам всем первые столбцы файла без пустого и строк комментария.

sort -u

Это сортирует данные и устраняет дубликаты сразу.

cat -n

Просто добавляет номера строки.

1
ответ дан 30 October 2019 в 07:19
awk '{print $1}' /etc/services | grep -v # | uniq | sort > yourFile
-1
ответ дан 30 October 2019 в 07:19

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

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