如何从文件中提取服务名称并将其保存在文件的干净版本中?

如何从文件中提取服务名称并将其保存在文件的干净版本中?

我试图弄清楚如何从 /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输出分配给的标准输入command1command2
  • sort -usort按字母顺序对行进行排序,并仅输出相等运行的第一个行(-u--unique
  • >out– 将bash标准输出重定向到指定文件
  • wc -l– 让wc打印新的line 计数

答案3

awk '{print $1}' /etc/services | grep -v # | uniq | sort > yourFile

相关内容