从日志中读取,然后删除另一个文件中的匹配数据

时间:2018-10-17 15:40:01

标签: bash

我想使用Oscam Casrdsharing服务器编写脚本

这是我的测试

cat oscam.log | grep "error"

示例输出:

2018/10/17 16:43:07 5C94A12E p    (cccam) cccam(r) test.dyndns.org: login failed, error

一旦发现错误,我需要在另一个文件中删除其信息:

oscam.server

[reader]
label                         = test.dyndns.org
protocol                      = cccam
device                        = test.dyndns.org,12000
key                           = 0102030405060708091011121314
user                          = renegade
password                      = renegade123
inactivitytimeout             = 30
group                         = 1
cccversion                    = 2.1.2
cccmaxhops                    = 0
cccmindown                    = 1
ccckeepalive                  = 1

blalbal
blalblalb
blalblalb
lablalb

我需要删除那些匹配的“ test.dyndns.org”行。我只想保留以下内容:

blalbal
blalblalb
blalblalb
lablalb

到目前为止,我已经尝试了以下代码:

awk '/test.dyndns.org/{while(getline && $1 != ""){}}1' oscam.server

#output is :
[reader]

blalbal
blalblalb
blalblalb
lablalb

但是行[reader]仍然存在。我该怎么做才能完全删除障碍?

3 个答案:

答案 0 :(得分:1)

对于有问题的人,您正在寻找一种多行模式:

  • [reader]开始
  • 包含test.dyndns.org
  • 后跟一个空行,即2个换行符

您可以使用perl来做到这一点:

perl -p0e 's/\[reader\]((?!\n\n).)*test\.dyndns\.org((?!\n\n).)*((\n\n)|(\n?\Z))//sig' oscam.server

perl 's/.../.../s'是用另一个模式替换匹配的正则表达式的命令,ig标志用于删除文本输入中的所有匹配项。在这里,我们用一个空字符串替换找到的模式。

-p0e标志用于为perl启用多行处理。您可以使用-p0i.bak -e进行就地文件编辑(请注意:它将永久更改您的输入文件。)

.][在命令中转义,因为它们对正则表达式具有特定含义。

正则表达式说明:

  • \[reader\]:以“ [reader]”字符串开头的模式...
  • ((?!\n\n).)*negative lookaround。后跟任何不形成2个换行符的字符...
  • test\.dyndns\.org:后跟字符串“ test.dyndns.org” ...
  • ((?!\n\n).)*:后跟任何不构成2个换行符的字符...
  • ((\n\n)|(\n?\Z)):以2个换行符或文件结尾结尾

编辑:

要在perl脚本中使用bash变量,请you can use the -s flag

要自动引用perl变量的内容,必须使用perl特殊字符:\Q and \E

您的函数现在将如下所示:

perl -sp0e 's/\[reader\]((?!\n\n).)*\Q$input\E((?!\n\n).)*((\n\n)|(\n?\Z))//sig' -- -input="<DESIRED INPUT HERE>" oscam.server

答案 1 :(得分:0)

OMG我终于找到了答案:)

查看脚本。

sed '/test.dyndns.org/,/\[reader\]/{/\[\n\]/b;d;}' oscam.server

答案 2 :(得分:0)

我现在终于创建了一个提示方法:),无论如何dint要在编辑中进行编辑,因此需要在其后触摸 mv 参数

#!/bin/bash
PHONEFILE=/etc/tuxbox/config/oscam_modern/oscam.server
PHONEFILE2=/etc/tuxbox/config/oscam_modern/oscam.server.new 


read -p "Delete server (paste the url that was listed on top): " oldnum
if [ ! "$oldnum" ]; then exit; fi
perl -sp0e 's/\[reader\]((?!\n\n).)*\Q$input\E((?!\n\n).)*((\n\n)|(\n?\Z))//sig' -- -input="$oldnum" $PHONEFILE > $PHONEFILE2
mv $PHONEFILE2 $PHONEFILE