![zsh:理解 wc 的命令输出并将其传递给其他命令](https://linux22.com/image/941099/zsh%EF%BC%9A%E7%90%86%E8%A7%A3%20wc%20%E7%9A%84%E5%91%BD%E4%BB%A4%E8%BE%93%E5%87%BA%E5%B9%B6%E5%B0%86%E5%85%B6%E4%BC%A0%E9%80%92%E7%BB%99%E5%85%B6%E4%BB%96%E5%91%BD%E4%BB%A4.png)
我正在尝试创建一个复杂的命令(使用 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
但会重复多次。