Linux - 从某些行到文件末尾的“grep”

pho*_*ong 11 linux command-line

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

line 1
line 2A
line 3
line 4A
line 5
Run Code Online (Sandbox Code Playgroud)

我想从“第 2A 行”到文件末尾“grep”,就像这样

cat file.txt|some_grep "line 2A"
Run Code Online (Sandbox Code Playgroud)

另外,我想从“第 2A 行”“grep”到包含“A”的下一行,就像这样

cat file.txt| some_grep "A"
Run Code Online (Sandbox Code Playgroud)

我想打印出来:

line 2A
line 3
line 4A
Run Code Online (Sandbox Code Playgroud)

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

jll*_*gre 11

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

sed -n '/2A/,$p'
Run Code Online (Sandbox Code Playgroud)
  • -n : 抑制sed默认输出
  • /2A/ :第一个包含“2A”的输出行
  • $ : 到文件结尾

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

sed -n '/2A/,/A/p'
Run Code Online (Sandbox Code Playgroud)
  • /A/ : 输出直到一行包含“A”

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

printf "/A\n.+1,/A/p\nq" | ed -s
Run Code Online (Sandbox Code Playgroud)
$ > 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
Run Code Online (Sandbox Code Playgroud)


dav*_*085 7

(从评论中扩展)

awkGNU-awk (gawk) 手册中所述,能够选择完美匹配此需求的“范围”行。(此功能在其他awks 中有效,但gawk手册易于链接。)

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

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

如果停止行总是有一些不同于2之前的字符,A则可以简化为awk '/line 2A/,/[^2]A/'在匹配除 2 以外的任何字符的行之后停止,后跟 A。 digit-A 与 2A 不同,但与其他 As 不同WHAT;为此,停止条件可能是,/line [013-9]A/


agt*_*ver 5

我认为最好的方法是与和grep结合使用。首先,使用 grep 获取所需字符串所在的行(输出行号;在第一个匹配后停止搜索):cuttail-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
Run Code Online (Sandbox Code Playgroud)

输出行直到somestring使用head代替tail-n -#代替-n +#。您还可以将两者结合起来以获取从一个字符串到另一个字符串的行。