如何从匹配行开始显示文件的其余部分?

Oma*_*ani 14 command-line text-processing

我想显示与搜索词匹配的行以及文件中的所有剩余行。

例如,如果我使用:

more text.txt | egrep show
Run Code Online (Sandbox Code Playgroud)

它只会显示其中包含“show”的行,而我希望像这样的start命令:

more text.txt | start show
Run Code Online (Sandbox Code Playgroud)

这将显示与搜索词匹配的第一行之后的所有行。

但是,它不适用于我的 Ubuntu。我该如何安装它或类似的东西?

mur*_*uru 24

如果您不是特别需要 grep,您可以使用sedawk

sed -n '/show/,$p' text.txt
awk '/show/ {display=1} display {print}' text.txt
Run Code Online (Sandbox Code Playgroud)
  • sed通常输出所有行,但会-n阻止它。 /show/,$是从匹配正则表达式的第一行开始show到最后一行 ( $)结束的行范围。print ( p) 命令打印该行范围。
  • awk使用成对的序列(通常在单独的行上以提高可读性),因此匹配输入行中任何位置的正则表达式的条件也是如此,并定义了一个名为to的变量。显然,condition是 的缩写形式,并且符合每个人的预期,即:打印输入行。condition { action }/show/showdisplay=1display1displaydisplay != 0print


Jos*_*Jos 15

如果你的文件少于 10000 行,你可以这样做:

grep -A 10000 show text.txt
Run Code Online (Sandbox Code Playgroud)

-A标志将显示包含搜索字符串 ( show) 的行和接下来的 10000 行。

但是,我-A稍微玩了一下标志,我注意到它grep会智能地组合输出,因此每次show找到字符串时都不会得到 10001 行。所以基本上,它会从包含show. 如果您的文件包含超过 10000 行,请适当调整参数。

您可以使用该alias命令创建您自己的自定义命令以达到相同的结果。

编辑:稍微更优雅的解决方案是使用

 grep show -A $(wc -l < text.txt) text.txt
Run Code Online (Sandbox Code Playgroud)

它将使用文件的实际长度作为-A标志。这需要您指定文件名两次。不幸的是,这将阻止使用别名,但您可以编写一个 shell 函数来执行此操作。

显然,在这种情况下,您需要先指定搜索字符串以避免错误。

  • “这要求您指定文件名两次(这当然需要别名)。”:这就是别名不会再剪切它的地方 - 可以使用 bash 函数。 (3认同)

JoL*_*JoL 5

awk '/show/,0' text.txt
Run Code Online (Sandbox Code Playgroud)

awk 允许指定一个范围condition-expression , condition-expression,其中对第一个条件返回 true 之间的每一行计算操作代码,直到第二个条件返回 true。

通过使用常量 false作为第二个条件,将为匹配行及其之后的每一行运行0默认操作。{ print }

如果您想定义start命令,awk允许传递字符串变量,所以您可以:

start() {
  awk -v regex="$1" '$0 ~ regex, 0' "${@:2}"
}
Run Code Online (Sandbox Code Playgroud)

$0 ~ regex用于匹配字符串,就像它是正则表达式一样。$0awk 中是指整行。"${@:2}"是第一个命令参数之后的所有命令参数(如果有)。这样,您可以选择将文件指定给start,或者让它从管道输入中读取。