如何使用 grep 搜索/etc/services
并仅输出名称以 结尾的服务的行s
?
答案1
cut -f1 /etc/services | grep -v '^#' | grep 's$'
或者
cut -f1 /etc/services | grep '^[^#].*s$'
解释
该文件
/etc/services
包含多个列,而服务名称是第一列。要打印使用制表符 (\t
) 的文件的第一列,请使用cut -f1
(f
代表F领域)。文件中还有以符号开头的注释
#
。该命令grep -v '^#'
会将它们过滤掉。-v
打印行不是包含模式,^
表示行的开头。
现在我们获得了可以使用进行简单过滤的服务列表
grep 's$'
。$
表示行的结尾。
备择方案
- 这两个
grep
调用可以合并为一个:grep '^[^#].*s$'
。此正则表达式查找满足以下所有规则的行:- 不是以 开头
#
(更准确地说:以不等于( )^
的字符开头 ( )#
[^#]
- 后跟未指定数量的任意字符 (
.*
) 和 s
在行尾之前拥有权利($
)。
- 不是以 开头
- 这些命令
sed
也awk
可以完成这项工作。
处理重复项
您可能会发现服务名称被列出多次,因为它们使用多个端口。(此信息包含在我们已过滤掉的第二列中。)有一个命令可以同时按字母顺序打印每个项目一次:sort --unique
。只需将上一个命令的输出通过管道传输到sort
:
cut -f1 /etc/services | grep '^[^#].*s$' | sort --unique
也可以看看
答案2
grep "s$" /etc/services
就是答案。
你可以通过阅读手册找到答案,man grep
在终端中,或者在网上搜索它。