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

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

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

!        lat             long          elev (m)
!      44.5199005      11.6468000       50.4276

我需要提取第二行并将其保存在另一个文本文件中。数字是可变的,文本中也多次出现“!”语法。第一行的“!”和“lat”之间总是有 8 个空格,但第二行不是这样。是否有任何命令允许我提取下一行grep "! lat" text

答案1

您可以使用grep -A1 'expression'

来自手册:

-A num
--after-context=num
    Print num lines of trailing context after matching lines.

就你的情况而言:

grep -A1 "!        lat" foo | grep -v "!        lat"

应该只提取第二行。

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

答案2

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

grep -Pzo '!\s{8}lat[^\n]*\n\K[^\n]+' file.txt
  • -P将使我们能够使用 PCRE,-o将只获取所需的部分

  • !\s{8}lat[^\n]*\nlat将匹配后面有 8 个空格的行!,还将匹配结尾的换行符,\K将丢弃此匹配

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

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

grep -Pzo '!\s{8}lat\s+[^\n]*\n\K[^\n]+' file.txt

例子:

$ 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

答案3

  1. awk

    awk '/! {8}lat/ {a=1; next} a {a=0; print};' foo
    
  2. sed

    sed -n '/! \{8\}lat/{n;p}' foo
    

相关内容