我想使用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]
仍然存在。我该怎么做才能完全删除障碍?
答案 0 :(得分:1)
对于有问题的人,您正在寻找一种多行模式:
[reader]
开始test.dyndns.org
您可以使用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