我有配置文件,我希望匹配特定的行,如“server.port = 5480”。保留匹配的第一个删除休息匹配行。实施例
server.port=5480
server.port=5480
server.port=5480
ssl.engine = "enable"
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
ssl.cipher-list = "FIPS':' +3DES':'!aNULL"
ssl.engine = "enable"
ssl.use-sslv2 = "disable"
server.port=5480
server.port=5480
server.port=5480
server.port=5480
所需的输出只有一行
server.port=5480
ssl.engine = "enable"
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
ssl.cipher-list = "FIPS':' +3DES':'!aNULL"
ssl.engine = "enable"
ssl.use-sslv2 = "disable"
使用sed我想要这个和另外一个不是序列行可能是变体
答案 0 :(得分:5)
让我们使用awk
并打印所有不包含server.port
或第一次出现的行:
$ awk '!(/server.port/ && c++)' file
server.port=5480
ssl.engine = "enable"
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
ssl.cipher-list = "FIPS':' +3DES':'!aNULL"
ssl.engine = "enable"
ssl.use-sslv2 = "disable"
注意我使用这种方法,因为我看到其他行不止一次出现。
awk中的真实条件会触发打印整行。因此,如果您说awk '1' file
,则将打印所有文件。
我们在这里所做的恰恰相反:在某些情况下限制打印。这些情况是在第2次,第3次...... server.port
时发生的
由于/server.port/
匹配其中包含“server.port”的行,因此我们还会检查变量c
是否为正。
首次设置时!(True && 0++)
!(True && False)
→!(False)
→True
。
在其他情况下,!(True && positive++)
为!(True && True)
→!(True)
→False
,因此不会触发任何打印。