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
之前添加一个子(/;/,“”)
。