Bash grep行和后面的行合并为一行

Bash grep行和后面的行合并为一行,bash,grep,Bash,Grep,我有一个包含大量信息的文本文件。我只想得到别名。 所有别名和端口信息用空格分隔,每个端口用分号分隔 这个命令 cat ~/Desktop/brocade_output.txt |grep -A1 alias 给我这个输出。所有别名都以前缀开头 > alias: a_computer_1 40:01:00:00:ab:00:00:aj; 60:01:00:0e:1e:d0:b5:fd -- alias: a_helpdesk 41:00

我有一个包含大量信息的文本文件。我只想得到别名。 所有别名和端口信息用空格分隔,每个端口用分号分隔

这个命令

cat ~/Desktop/brocade_output.txt  |grep -A1 alias
给我这个输出。所有别名都以前缀开头

>  alias:   a_computer_1    
        40:01:00:00:ab:00:00:aj; 60:01:00:0e:1e:d0:b5:fd
--
 alias: a_helpdesk  
        41:00:00:24:fh:5c:99:9e; 81:00:00:24:ff:5c:48:9f
--
 alias: a_library   
        91:00:00:24:fh:5c:99:9g; 91:00:00:24:ff:5c:48:9g
--
期望输出

a_computer_1 40:01:00:00:ab:00:00:aj 60:01:00:0e:1e:d0:b5:fd
a_helpdesk 41:00:00:24:fh:5c:99:9e 81:00:00:24:ff:5c:48:9f
a_library 91:00:00:24:fh:5c:99:9g 91:00:00:24:ff:5c:48:9g
对于sed:

sed -n '/alias:/N;{s/.*\(a_[^ ]* \)[[:space:]]*\(.*\)/\1\2/p;}' file
添加
-i
标志以就地编辑文件。

使用sed:

sed -n '/alias:/N;{s/.*\(a_[^ ]* \)[[:space:]]*\(.*\)/\1\2/p;}' file
添加
-i
标志以在位编辑文件。

尝试以下操作:

grep -A1 alias ~/Desktop/brocade_output.txt | cut -f2- -d":"
我的理解是,您需要第一个
后面的那部分行,因此使用
作为
剪切的分隔符,并从2开始获取所有字段就可以了。

试试这个:

grep -A1 alias ~/Desktop/brocade_output.txt | cut -f2- -d":"
我的理解是,您需要第一个
后面的那部分行,因此使用
作为
cut
的分隔符,并从2开始获取所有字段就可以了。

在awk中:

$ awk '/alias/ {f=$2;next} f{$1=$1; print f, $0; f=0 }' file
a_computer_1 40:01:00:00:ab:00:00:aj; 60:01:00:0e:1e:d0:b5:fd
a_helpdesk 41:00:00:24:fh:5c:99:9e; 81:00:00:24:ff:5c:48:9f
a_library 91:00:00:24:fh:5c:99:9g; 91:00:00:24:ff:5c:48:9g
解释:

  • /alias/{f=$2;next}
    当记录中的
    alias
    时,
    f
    等于第二个字段
  • f{$1=$1;打印f$0;f=0}
    设置
    f
    时,打印它和“下一条记录”
    • 在awk中:

      $ awk '/alias/ {f=$2;next} f{$1=$1; print f, $0; f=0 }' file
      a_computer_1 40:01:00:00:ab:00:00:aj; 60:01:00:0e:1e:d0:b5:fd
      a_helpdesk 41:00:00:24:fh:5c:99:9e; 81:00:00:24:ff:5c:48:9f
      a_library 91:00:00:24:fh:5c:99:9g; 91:00:00:24:ff:5c:48:9g
      
      解释:

      • /alias/{f=$2;next}
        当记录中的
        alias
        时,
        f
        等于第二个字段
      • f{$1=$1;打印f$0;f=0}
        设置
        f
        时,打印它和“下一条记录”

      这也可以在Perl中完成,只需几个字符:

      perl -ane 'if (/alias/){$_=<>; s/^\s*//; print "$F[1] $_"}' file
      
      perl-ane'if(/alias/){$\s/^\s*/;打印“$F[1]$\u”}”文件
      
      使用以下命令行选项:
      -
      -n
      围绕输入文件的每一行循环
      -
      -a
      自动拆分模式–将输入行拆分为
      @F
      数组
      -
      -e
      执行perl代码

      /alias/
      与当前行匹配
      $F[1]
      @F

      $\u=
      $\u
      默认变量分配到输入文件的下一行

      s/^\s*/
      $中删除前导空格

      这也可以在Perl中通过几个字符完成:

      perl -ane 'if (/alias/){$_=<>; s/^\s*//; print "$F[1] $_"}' file
      
      perl-ane'if(/alias/){$\s/^\s*/;打印“$F[1]$\u”}”文件
      
      使用以下命令行选项:
      -
      -n
      围绕输入文件的每一行循环
      -
      -a
      自动拆分模式–将输入行拆分为
      @F
      数组
      -
      -e
      执行perl代码

      /alias/
      与当前行匹配
      $F[1]
      @F

      $\u=
      $\u
      默认变量分配到输入文件的下一行

      s/^\s*/
      $中删除前导空格

      基本上就是“输出”部分的内容。只是一个大得多的文件。听起来像是
      sed
      awk
      的作业。如果打印上下文行,grep在打印上下文行时总是会引入分隔符。尽管可以取消分隔符,但grep不会重新格式化内容。我同意疯狂物理学家的观点。这最好用sed、awk甚至perl来完成。谢谢,我愿意接受sed或awk的建议。没有嫁给格雷普,基本上是“输出”部分的内容。只是一个大得多的文件。听起来像是
      sed
      awk
      的作业。如果打印上下文行,grep在打印上下文行时总是会引入分隔符。尽管可以取消分隔符,但grep不会重新格式化内容。我同意疯狂物理学家的观点。这最好用sed、awk甚至perl来完成。谢谢,我愿意接受sed或awk的建议。没有和grep结婚。很抱歉这不起作用,我还更新了问题以提供更多信息。“sed:1:”/alias:/N;{s/*(a_comp…):替换命令中的坏标志:'}'“很抱歉,这不起作用,我还更新了问题以提供更多信息。”sed:1:“/alias:/N;{s/*(a_comp…):替换命令中的坏标志:'}'”“对不起,我第一次发布时用“-f1-”而不是“-f2”,这是一个打字错误。很抱歉,我第一次发布时用“-f1-”而不是“-f2”,这是一个输入错误。现在我们用煤气烹饪。仍然有分号,但我可以找到另一种方法删除它。
      ++
      你知道为什么!哦,有一个分号,漏了那个。添加一个
      子(/;/,“)
      $1=$1
      之前。现在我们用煤气做饭。仍然有分号,但我可以找到另一种方法删除它。
      ++
      你知道为什么!哦,有一个分号,没有找到。在
      $1=$1
      之前添加一个
      子(/;/,“”)