Bash 从日志读取,然后删除另一个文件中的匹配数据
我想用Oscam CasrdShared服务器写一个脚本 这是我的测试: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
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
:后跟任何不构成2个换行符的字符((?!\n\n)。*
:以两行换行符或文件结尾((\n\n)|(\n?\Z))
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或其他工具将以相同的方式工作,但会有更大的难度我正在处理多行