如果满足条件,如何插入新行+值

时间:2015-06-22 17:40:18

标签: bash awk sed

如果前一行是IP,我需要一个bash / sed / grep / awk命令来添加新行和零值​​。像这样:

INPUT:

1.0.0.6
1.0.130.99
44
1.0.210.94
43
1.0.212.145
43
1.0.254.4
1.1.1.1
1.1.1.138

输出:

1.0.0.6 
0
1.0.130.99
44
1.0.210.94
43
1.0.212.145
43
1.0.254.4
0
1.1.1.1
0
1.1.1.138
0

2 个答案:

答案 0 :(得分:0)

在IP

之后打印0

首先使用匹配ip,如下所示:

/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/

正则表达式是自解释的,例如可以使用来识别ip。在以下awk单行中,我们将检查作为IP地址的行,并在满足条件时打印0

awk --re-interval '{print} /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ { print 0 }' file

其中file是当前目录中的输入文件。这应该产生所需的输出。

在IP之间打印0

awk --re-interval '{
    if ($0 ~ /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/) { 
        if (prev)
            print 0
        prev=1
    } else {
        prev=""
    }
    print
}' file

如果当前行是IP而前一行也是(未经测试),则应打印0

答案 1 :(得分:0)

再次非常感谢你。它适用于您的代码。

我刚刚意识到我的数据存在另一个问题。我需要用一定数量的数字替换一系列数字。我真的很难用sed(比如sed "s/[33-64]/64/")或awk编写代码,但总是得到错误的结果。它倾向于替换单个数字而不是数字...... 我需要的是:替换0-32 - > 32,33-64 - > 64,65-128 - > 128,129-255 - > 255

INPUT:

1.208.121.246
48
49
48
49
1.208.121.250
135
150
1.209.125.134
17
1.209.121.250
99

OUPTUT:

1.208.121.246
64
64
64
64
1.208.121.250
255
255
1.209.125.134
32
1.209.121.250
128

非常感谢最后的建议!