用于抓取多组线的 Head/Tail 命令

用于抓取多组线的 Head/Tail 命令

我必须通过一次命令从文件中获取前两行、第 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

由于约束是仅使用headand 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和命令的理解:请参阅和。tailman headman tail

相关内容