zsh:理解 wc 的命令输出并将其传递给其他命令

zsh:理解 wc 的命令输出并将其传递给其他命令

我正在尝试创建一个复杂的命令(使用 shell 替换和算术表达式),我想知道是否有人可以帮助我理解该命令的输出wc

例如,这里有几个例子:

[11:10:33] labreu:~ $ wc -l test.txt
5 test.txt
[11:10:40] labreu:~ $ cat test.txt| wc -l
5

为什么命令会返回不同的值?我尝试查看它的手册页,但那里没有任何相关信息...

顺便说一句,我问这个问题只是因为我试图用以下命令跳过文件的 x 行:

[11:25:35] labreu:~ $ tail -n "+$(( $(wc -l test.txt)-2 ))" test.txt                       
zsh: bad math expression: operator expected at `test.txt-2...'

在注意到wc返回number_of_lines filename并使用管道(或重定向产生不同的结果)后,我设法通过使用类似以下内容来获得我需要的东西:

tail -n "+$(( $(wc -l<test.txt )-2 ))" test.txt

tail -n "+$(( $(cat test.txt | wc -l )-2 ))" test.txt 

无论如何,主要问题仍然存在:为什么wc在管道内使用(或使用输入重定向)时命令会返回不同的输出?

谢谢

答案1

第一种方法是在命令行上使用。第二种方法可以在编码时使用。

该命令本身可以对多个文件执行此操作,因此它需要告诉您多少行属于哪个文件。

$ wc -l *.xml
   712 1.xml
  3055 2.xml
   464 3.xml
  3055 4.xml

wc -l本身不区分 1 个文件、通配符或多个文件。为了在不使用名称的情况下做到这一点,我倾向于使用wc -l < file.txt重定向。

连接方法/管道版本始终是 1 个文件,因此文件的名称是隐含的。for 循环仍会隐含每个文件 1 个,wc -l但会重复多次。

相关内容