Linux - 从特定行到文件末尾进行“grep”

Linux - 从特定行到文件末尾进行“grep”

我有一个类似这样的文本文件:

line 1
line 2A
line 3
line 4A
line 5

我想从“第 2A 行”到文件末尾进行“grep”,如下所示

cat file.txt|some_grep "line 2A"

另外,我想从“第 2A 行”到下一行包含“A”的行“grep”,如下所示

cat file.txt| some_grep "A"

我想要打印出这个:

line 2A
line 3
line 4A

哪个命令可以帮助我实现这一点?

答案1

(扩展自评论)

awk能够选择完全符合这一需求的“范围”线路,因为GNU-awk(gawk)手册中描述。(该功能在其他awks 中有效,但gawk手册很容易链接。)

awk '/line 2A/,0'打印从第一个匹配的行开始line 2A一直到输入结束的行,因为这0是一个永远不会成立的条件。

awk '/line 2A/,/A/&&!/line 2A/'从匹配的行开始打印,并在匹配但不line 2A匹配的行之后停止(因此不能与起始行相同)。它将开始Aline 2A再次随后的 line 2A等等;如果您想防止这种情况发生,可以使用稍微复杂一些的方法。

如果停止行总是有一些除2之前以外的字符,A则可以将其简化为awk '/line 2A/,/[^2]A/'在与除 2 之外的任何字符匹配的行之后停止,后跟 A。您可能需要对此进行变体,例如在不同于 2A 的任何单个数字 A 上停止,但不在类似 的其他 A 上停止WHAT;为此,停止条件可能是,/line [013-9]A/

答案2

我想从“第 2A 行”到文件末尾进行“grep”:

sed -n '/2A/,$p'
  • -n :抑制sed默认输出
  • /2A/ :输出第一行包含“2A”的行
  • $ :到文件末尾

我想从“第 2A 行”到下一行包含“A”的行“grep”:

sed -n '/2A/,/A/p'
  • /A/ :输出直到某一行包含“A”

我想从第一行包含“A”到下一行“grep”:

printf "/A\n.+1,/A/p\nq" | ed -s

$ > foo echo "line 1
line 2A
line 3
line 4A
line 5"

$ sed -n '/2A/,$p' foo
line 2A
line 3
line 4A
line 5

$ sed -n '/2A/,/A/p' foo
line 2A
line 3
line 4A

$ printf "/A\n.+1,/A/p\nq" | ed -s foo
line 2A
line 3
line 4A

答案3

我认为最好的方法是grep结合使用cuttail。首先,使用 grep 来获取所需字符串所在的行(-n输出行号;-m 1在第一个匹配后停止搜索):

grep -n -m 1 "somestring" filename.txt

这将输出行号和字符串本身。要截断字符串,我们使用 cut(-f1:输出第一个字段;-d:使用“:”作为分隔符):

grep -n -m 1 "somestring" filename.txt | cut -f1 -d:

接下来,我们将此命令的输出用作 tail 中的参数。通常,tail 会打印最后 k 行,但使用-n +k,我们让 tail 从第 k 行开始打印。总命令为:

tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt

要输出直到的行,请somestring使用head而不是tail-n -#而不是-n +#。您也可以将两者结合起来以获取从一个字符串到另一个字符串的行。

答案4

请尝试以下代码 -

sed -n '6,$p' infile

相关内容