我试图弄清楚如何从 /etc/services 中提取所有服务名称并将它们发送到文本文件按字母顺序排序删除所有重复项删除所有空白行和不必要的空格并进行行数统计
答案1
该文件/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
读取给定的文件(或标准输入),然后对每一行执行以下操作:
condition_for_a_line { commands_when_condition_is_met }
我们使用!/^\s*$/ && !/^\s*#/
以下条件:行不为空和行没有以注释开头。当两个条件都满足时,$1
将打印第一列。这将为我们提供文件的所有第一列,不包括空行和注释行。
sort -u
这将对数据进行排序并一次性消除重复数据。
cat -n
只需添加行号。
答案2
这是我的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
删除以 ord 字符开头 (^
) 的每一行w
,而是删除不符合此条件的每一行s/\s.*//
– 在每一行中,用空白字符s
替换第一个匹配项,并将后面的所有内容 ( ) 替换为空(= 删除它)s
.*
command1 | command2
– 将的标准bash
输出分配给的标准输入command1
command2
sort -u
–sort
按字母顺序对行进行排序,并仅输出相等运行的第一个行(-u
或--unique
)>out
– 将bash
标准输出重定向到指定文件wc -l
– 让wc
打印新的l
ine 计数
答案3
awk '{print $1}' /etc/services | grep -v # | uniq | sort > yourFile