我正在尝试创建一个复杂的命令(使用 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
本身不区分 1 个文件、通配符或多个文件。要做到这一点,我倾向于使用wc -l < file.txt
重定向的名称。连接方法/管道版本始终是 1 个文件,因此文件名是隐含的。for 循环仍然意味着每个文件 1 个
wc -l
但重复相同的多次。