Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从日志读取,然后删除另一个文件中的匹配数据_Bash - Fatal编程技术网

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

Bash 从日志读取,然后删除另一个文件中的匹配数据,bash,Bash,我想用Oscam CasrdShared服务器写一个脚本 这是我的测试: 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

我想用Oscam CasrdShared服务器写一个脚本

这是我的测试:

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]
行仍然存在。我该怎么做才能完全删除该块?

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

  • [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)。*
    :。后跟任何不构成两个换行符的字符
  • test\.dyndns\.org
    :后跟字符串“test.dyndns.org”
  • ((?!\n\n)。*
    :后跟任何不构成2个换行符的字符
  • ((\n\n)|(\n?\Z))
    :以两行换行符或文件结尾
编辑:

要在perl脚本中使用bash变量

为了自动引用perl变量的内容,必须使用perl特殊字符:

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

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

我现在终于做了一个提示方法:),反正我不想在编辑中编辑,所以需要在那之后触摸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

你想保留还是删除它?是的,也要删除,我看到了一些东西,但没有删除[reader]行awk'/test.dyndns.org/{while(getline&&$1!=“”){}1'oscam.server.if变量的IP/dyndns地址如何格式化?因为在perl上重新格式化文本对于bash来说更困难integrating@ZoltánVeres我编辑了我的答案以回应您的评论。如果它对您有效,请告诉我!什么都没有发生:(,只能在perl上使用?不可能使用awk、sed、grep方法?@ZoltánVeres您确定什么都没有发生吗?该命令是否显示了一些内容?默认情况下,在bash中,命令几乎永远不会修改您的文件。您必须使用
-i
标志或使用流重定向。awk、sed或其他工具将以相同的方式工作,但会有更大的难度我正在处理多行