я пытаюсь понять, как извлечь все имена служб из / etc / services и отправить их в текстовый файл отсортировать их в алфавитном порядке удалить все дубликаты избавиться от пустых строк и ненужных пробелов и указать количество строк
Вот мой 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
присвоиться command1
stdout к command2
stdinsort -u
– позволить sort
отсортируйте строки в алфавитном порядке и произведите только первое из равного выполнения (-u
или --unique
)>out
– позволить bash
перенаправьте stdout в указанный файлwc -l
– позволить wc
распечатайте новоеl
количества ineФайл /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
Просто добавляет номера строки.
awk '{print $1}' /etc/services | grep -v # | uniq | sort > yourFile