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

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

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

例如,如果我使用:

more text.txt | egrep show

它只会显示其中包含“show”的行,而我希望得到类似start命令的内容:

more text.txt | start show

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

但是,它无法在我的 Ubuntu 上运行。我该如何安装它或类似的东西?

答案1

如果您不特别需要 grep,您可以使用sedawk来实现这一点:

sed -n '/show/,$p' text.txt
awk '/show/ {display=1} display {print}' text.txt
  • sed通常会输出所有行,但-n会阻止这种情况。 /show/,$是从与正则表达式匹配的第一行开始到show最后一行结束的行范围($)。print(p)命令打印该行范围。
  • awk使用成对的序列(通常为了便于阅读而放在不同的行上),所以条件是匹配输入行中任意位置的正则表达式,并定义一个名为的变量。显然,条件是的简写形式,并且执行每个人都期望的操作,即:打印输入行。condition { action }/show/showdisplay=1display1displaydisplay != 0print

答案2

如果你的文件少于 10000 行,你可以执行以下操作:

grep -A 10000 show text.txt

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

但是,我尝试了-A一下该标志,发现它grep会智能地组合输出,因此每次show找到字符串时您不会得到 10001 行。因此,基本上,它会从包含的行开始向您显示整个文件一次。show如果您的文件包含超过 10000 行,请适当调整参数。

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

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

 grep show -A $(wc -l < text.txt) text.txt

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

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

答案3

awk '/show/,0' text.txt

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

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

如果你想定义你的start命令,awk允许传递字符串变量,所以你可以这样做:

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

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

答案4

在 Bash 中:

word="show"
e=0

while read line
do
    [[ $line =~ "$word" ]] && e=1
    [ $e -eq 1 ] && echo "$line"
done < text.txt

可以将其添加为函数,如下~/.bashrc所示:

grep2end () {

word="$1"
e=0

while read line
do
    [[ $line =~ "$word" ]] && e=1
    [ $e -eq 1 ] && echo "$line"
done < "$2"

}

用法如下:

grep2end "show" "text.txt"

相关内容