Unix / Linux重定向和管道

时间:2018-09-22 05:05:48

标签: linux bash unix command-line

我正在做一本书“您的Unix / Linux终极指南”中的一个练习,试图最好地学习命令行,这个问题我思考了大约45分钟后仍无法回答,并且未提供解决方案。这本书,这是问题:

  

假设有一个名为“ access.log”的访问日志文件(每行一个条目),一个过滤器“ userfilter”仅以访问日志格式输出与用户条目相对应的行,“ roomfilter”仅输出以访问日志格式的行对应于一个房间的条目,“ codefilter”仅以访问日志格式的行输出与“ entry”,“ exit”或“ denied”之一相对应的行。所有过滤器都接受一个参数来指定要输出的值。发出命令以显示“温斯顿”进入房间“ 101”的次数

在正确方向上的任何帮助将不胜感激,谢谢

2 个答案:

答案 0 :(得分:-1)

在unix术语中,过滤器是一种从某处获取文本行,逐行修改并输出它们的东西。在这种情况下,“修改”也可以表示吃掉/丢弃。

通常,您通过向过滤器提供数据来使用它;例如:

cat access.log | userfilter fred

将启动两个命令:“ cat access.log”获取一个文件(access.log),并将其发送出去。命令“ userfilter fred”启动第二个过程,该过程接受文本行,但仅输出符合条件user = fred的文本。魔术是通过管道符号|来完成的,管道符号|启动两个命令,并将第一个命令的输出连接到第二个命令的输入。

“ cat”,如果没有区别的话,则将数据输出到控制台(嗯,确实是“标准输出”)。 “ userfilter”没有什么不同-如果没有区别,则将数据发送到标准输出。实际上,所有这些命令(“过滤器”)都会总是将数据发送到标准输出(这是unix的方式):是操纵管道并连接它们的外壳。但是我想添加“如果没有不同的说法”,因为有些命令可以被告知表现不同。

现在,您可以获取最后一条命令的输出,并将其发送到其他位置,您猜怎么着?通过添加越来越多的管道“ |”。

我想您将像这样启动命令行:

cat access.log | userfilter winston | roomfilter 101

在上面的命令中,access.log中的所有行均通过userfilter,该过滤器仅输出其中包含用户winston的那些行。反过来,这些生成的行进入roomfilter,该过滤器仅输出带有101房间的那些。结果是,输出了101房间中winston的所有活动。

最后一个过滤步骤留给您,但我将帮助您计算结果。

假设您对最终的(相关的)日志行不再感兴趣,但是在对它们进行计数时,unix中有一个不错的“标准”过滤器可以准确地做到这一点:计数(它可以计数行,字符,单词)。它的名称是“ wc”,或者通俗地说是wc(1)。 “ 1”表示它是正常命令,您可以使用命令man wc阅读(手动)有关它的说明。很好,不是吗?此外,wc并不代表抽水马桶-它的意思是“字数统计”。

要计算向其显示的文本行数,正确的语法是“ wc -l”。因此,您可以使用以下命令来计算文件access.log中的行数:

cat access.log | wc -l

如果要计算winston做某事的次数,请使用:

cat access.log | userfilter winston | wc -l

我没有给您完整的答案,只是您自己搭建了几块砖;我希望这足够了-祝你好运!

答案 1 :(得分:-1)

cat access.log | userfilter winston | wc -l >> file.name

您可以将结果传输到新文件中。