我不能完全得到完全独特的结果 - Linux 流水线
Posted
技术标签:
【中文标题】我不能完全得到完全独特的结果 - Linux 流水线【英文标题】:I can't quite get the results to be fully unique - Linux pipelining 【发布时间】:2021-12-13 17:18:47 【问题描述】:我快到了...我应该最终得到 340 项独特的服务。到目前为止,我只能降到 341。
这些是我的任务:
-
从文件中提取所有服务名称。
按字母顺序对名称进行排序,删除所有重复项。
删除任何空白行或不包含
字母表。
将最终输出捕获到名为“uniqueservices.txt”的文件中。
使用条件命令计算文件中的行数
如果前面的组合命令成功,则执行。
这是我使用的命令:
cat /etc/services | grep -Ev '^#|^$' | cut -f1 | sort -u > uniqueservices.txt && wc -l uniqueservices.txt
这是我应该得到的:
This is what I should get
这是我实际得到的:
What I actually get
我猜有(一如既往)更好的方法可以做到这一点,但是......嘿,我是新手。不过这么近!
提前致谢。
S
【问题讨论】:
【参考方案1】:您的命令的cut -f1
部分通过扫描制表符分隔符的行来确定“第1 列”的含义。您看到的不匹配行可能只是使用了空格字符。
我想最简单的做法是再次运行cut
,但寻找空格而不是制表符。
cat /etc/services | grep -Ev '^#|^$' | cut -f1 | cut -d' ' -f1 | sort -u > uniqueservices.txt && wc -l uniqueservices.txt
【讨论】:
Ahhhhh,很好的@Raxi,非常完美。我只是假设我无法使用与以前相同的命令。谢谢你。我没有足够的代表来支持你......但它是实物。 :) 不用担心。是的,管道实际上是由 shell 处理的,而不是应用程序本身。当您运行单个程序(例如nano /etc/services
)时,会创建一个nano
进程,该进程将stdin 连接到您的终端(因此您可以输入内容),而stdout 同样连接到您的终端,因此会将内容打印到您的屏幕上。当您运行cat /etc/services | sort | head -5
时,沿途会创建3 个进程,其中cat
的stdout 简单地连接到sort
和sort
s stdout->head
s stdin 和head
' 的stdin s stdout 又是你的终端了。以上是关于我不能完全得到完全独特的结果 - Linux 流水线的主要内容,如果未能解决你的问题,请参考以下文章