使用sed + awk + ​​bash解析文本

时间:2017-10-19 20:22:29

标签: awk sed

我需要通过sed,awk或bash解析文本:

示例文字:

VRF MediaPlayer
192.168.1.1  52466  5w12d
192.168.1.2  52467  3w1d


VRF Telecom
10.10.1.1   43432  1d1h
12.20.1.1   23211  23w1d
30.30.22.1  43211  14w22d

预期输出:

192.168.1.1  52466  5w12d  MediaPlayer
192.168.1.2  52467  3w1d   MediaPlayer


10.10.1.1   43432  1d1h    Telecom
12.20.1.1   23211  23w1d   Telecom
30.30.22.1  43211  14w22d  Telecom

我怎样才能把VRF"姓名"作为第4列,我应该使用什么语法?

此致

5 个答案:

答案 0 :(得分:4)

awk '/^VRF /{vrf=$2}/^[0-9]/{print$0,vrf}' | column -t

或纯awk

awk '/^VRF /{vrf=$2} /^[0-9]/{printf("% -30s %s\n",$0,vrf)}'

答案 1 :(得分:0)

关注awk也可以帮助你。

awk '/^VRF/{val=$2;next} NF{$1=$1;print $0,val;next} 1' OFS="\t"  Input_file

答案 2 :(得分:0)

$ awk '/^VRF/{vrf=$2; next} {print $0 (NF ? OFS vrf : "")}' file
192.168.1.1  52466  5w12d MediaPlayer
192.168.1.2  52467  3w1d MediaPlayer


10.10.1.1   43432  1d1h Telecom
12.20.1.1   23211  23w1d Telecom
30.30.22.1  43211  14w22d Telecom

答案 3 :(得分:0)

使用sed

sed '/VRF /{s///;h;:A;N;s/.*\n//;/^$/!{G;s/\n/ /;p;bA}}' infile

如果该行不包含'VRF'打印

其他没有替代,所以line = MediaPlayer例如

并复制保留空间'h'

:A代表循环

获取换行符N并删除上一行s /.* \ n //

如果该行不为空,则复制模式空间'G'末尾的保留空间('MediaPlayer')

删除\ n,打印该行并返回:A

答案 4 :(得分:0)

一个简单的 awk 解决方案

$ awk '/^VRF/{a=$NF; next} NF{$0=$0 FS a}1 ' file
192.168.1.1  52466  5w12d MediaPlayer
192.168.1.2  52467  3w1d MediaPlayer


10.10.1.1   43432  1d1h Telecom
12.20.1.1   23211  23w1d Telecom
30.30.22.1  43211  14w22d Telecom

/^VRF/{a=$NF; next}:如果记录以VRF开头,则将变量a设置为该记录中的最后一个字段。然后next并且什么都不做

NF{$0=$0 FS a}1:如果NF然后行有一些字段且不为空,则只需将a附加到记录并打印即可。如果它是空的,请不要追加并简单地打印。