如何使用 grep 命令提取 grep 行的下一行?

dee*_*_86 6 grep

我有文本文件(整个文件的特定部分);

!        lat             long          elev (m)
!      44.5199005      11.6468000       50.4276
Run Code Online (Sandbox Code Playgroud)

我需要提取第二行并将它们保存在另一个文本文件中。数字是可变的和“!” 文中也多次出现语法。对于第一行,“!”之间总是有 8 个空格。和“纬度”,但第二行的情况并非如此。是否有任何命令可以让我在之后提取下一行grep "! lat" text

Way*_*Yux 8

您可以使用 grep -A1 'expression'

从手册:

-A num
--after-context=num
    Print num lines of trailing context after matching lines.
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

grep -A1 "!        lat" foo | grep -v "!        lat"
Run Code Online (Sandbox Code Playgroud)

应该只提取第二行。

注意:
您可以使用grep -P '^! {8}lat'而不是键入 many 。这不太容易出错。该-P标志启用 perl 样式的正则表达式,并且{8}('{' 之前有一个空格)正好匹配 8 个空格。


hee*_*ayl 5

您可以grep使用-z选项一次性获得所需的输出,以处理由 NUL 字符而不是换行符分隔的输入文件行,以便换行符可以逐字匹配。你可以做:

grep -Pzo '!\s{8}lat[^\n]*\n\K[^\n]+' file.txt
Run Code Online (Sandbox Code Playgroud)
  • -P将使我们能够使用 PCRE,-o只会为我们提供所需的部分

  • !\s{8}lat[^\n]*\n将匹配带有latafter!和 8 个空格的行,也将匹配尾随的换行符,\K将丢弃此匹配

  • [^\n]+ 然后将匹配下一行,即我们想要的输出。

在这里,我还假设 之后没有空格lat,如果必须至少有一个空格,您可以这样做:

grep -Pzo '!\s{8}lat\s+[^\n]*\n\K[^\n]+' file.txt
Run Code Online (Sandbox Code Playgroud)

例子:

$ cat file.txt 
!        lat             long          elev (m)
!      44.5199005      11.6468000       50.4276
!      30.5199005      2445.6468000       23.89

$ grep -Pzo '!\s{8}lat[^\n]*\n\K[^\n]+' file.txt 
!      44.5199005      11.6468000       50.4276
Run Code Online (Sandbox Code Playgroud)