我想显示与搜索词匹配的行以及文件中所有剩余的行。
例如,如果我使用:
more text.txt | egrep show
它只会显示其中包含“show”的行,而我希望得到类似start
命令的内容:
more text.txt | start show
这将显示与搜索词匹配的第一行之后的所有行。
但是,它无法在我的 Ubuntu 上运行。我该如何安装它或类似的东西?
答案1
如果您不特别需要 grep,您可以使用sed
或awk
来实现这一点:
sed -n '/show/,$p' text.txt
awk '/show/ {display=1} display {print}' text.txt
sed
通常会输出所有行,但-n
会阻止这种情况。/show/,$
是从与正则表达式匹配的第一行开始到show
最后一行结束的行范围($
)。print(p
)命令打印该行范围。awk
使用成对的序列(通常为了便于阅读而放在不同的行上),所以条件是匹配输入行中任意位置的正则表达式,并定义一个名为的变量。显然,条件是的简写形式,并且执行每个人都期望的操作,即:打印输入行。condition { action }
/show/
show
display=1
display
1
display
display != 0
print
答案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"