我必须通过一次命令从文件中获取前两行、第 43 行和第 44 行以及最后两行。是否可以在仅使用 head、tail 和管道命令且不使用 && 或 ; 等特殊运算符的情况下打印这些内容?我能想到的就是这个
(cat cool | head -n 2) | (tail -n +43 | head -n 2) | (tail -n 2)
但它有猫...另一个选择是
(head -n 2 < cool) | (tail -n +43 < cool | head -n 2) | (tail -n 2 < cool)
但由于某种原因它只显示最后一行
答案1
cat cool | head
是一个例子联合大学(猫的使用毫无用处)。让我们检查一下你的第二段代码:
(head -n 2 < cool) | (tail -n +43 < cool | head -n 2) | (tail -n 2 < cool)
让您印象深刻的是,它| command < cool
重定向了 stdin 两次。您必须选择先前管道命令的结果或文件cool
。两者都不是一个选择。
现在回到你的问题。解决方案与读取单个文件是:
- 读取前 42 行,仅显示前两行并丢弃后面的 40 行。这翻译为
head -n 42 | head -n 2
. - 显示接下来的两行(第 43 行和 44 行)。这翻译为
head -n 2
. - 显示最后两行。这翻译为
tail -n 2
.
现在把所有这些放在一起:
( head -n 42 | head -n 2; head -n 2; tail -n 2 ) < cool
另一种类似的推理:
( head -n 2; head -n 42 | tail -n 2; tail -n 2 ) < cool
答案2
由于约束是仅使用head
and tail
,我不认为可以用单个命令来满足要求:
# First two lines of the file "cool"
head -n2 cool
# Lines 43 and 44
head -n44 cool | tail -n2
# Last 2 lines
tail -n2 cool
您可以将它们作为一行三个命令一起崩溃,但这不是“一个命令“正如你的问题中所述:
head -n2 cool; head -n44 cool | tail -n2; tail -n2 cool
您可能想通过使用已安装的文档来刷新对head
和命令的理解:请参阅和。tail
man head
man tail