我需要从D-Link路由器中提取Voip日志,所以我设置了一个python脚本,通过telnet在该路由器中执行命令。 我的脚本执行“cat /var/log/calls.log”并返回结果,但是... 它还发送非重要的东西,比如BusyBox横幅等...... 如何忽略1到6和最后2的行? 这是我目前的输出:
yaba@foobar:/stuff$ python calls.py
BusyBox v1.00 (2009.04.09-11:17+0000) Built-in shell (msh)
Enter 'help' for a list of built-in commands.
DVA-G3170i/PT # cat /var/call.log
1 ,1294620563,2 ,+351xxx080806 ,xxx530802 ,1 ,3 ,1
DVA-G3170i/PT # exit
我只需要:
1 ,1294620563,2 ,+351xxx080806 ,xxx530802 ,1 ,3 ,1
(它可以有多行) 这样我就可以将它保存为CSV,然后保存到sql db。
谢谢,抱歉我的英语不好。
答案 0 :(得分:3)
为什么不在AWK中使用模式来匹配您想要的文本?
python calls.py | awk '/^[0-9]/{print}/'
AWK的整个 POINT 是根据图案匹配线条并操纵/打印这些匹配的线条。
已编辑以添加示例运行。
这是基于上面示例的垃圾数据文件。
$ cat junk.dat
BusyBox v1.00 (2009.04.09-11:17+0000) Built-in shell (msh)
Enter 'help' for a list of built-in commands.
DVA-G3170i/PT # cat /var/call.log
1 ,1294620563,2 ,+351xxx080806 ,xxx530802 ,1 ,3 ,1
DVA-G3170i/PT # exit
这是通过带过滤器的AWK运行它。
$ cat junk.dat | awk '/^[0-9]/ {print}'
1 ,1294620563,2 ,+351xxx080806 ,xxx530802 ,1 ,3 ,1
不需要SED,不需要计数线,除了AWK之外不需要任何东西。为什么要让事情变得比他们需要的更复杂?
答案 1 :(得分:1)
拨打sed
的一次电话:
sed -n '1,6d;7,${N;$q;P;D}'
或挑剔版sed
:
sed -ne '1,6d' -e '7,${N' -e '$q' -e 'P' -e 'D}'
您也可以根据匹配项进行操作:
sed -n '/^[0-9]+/p'
或类似的东西。
但是为什么你的Python脚本没有读取文件并进行过滤(而不是调用外部实用程序)?
答案 2 :(得分:0)
这样可行。它将过滤掉前6个和最后一个,这是您的示例所指示的。如果你真的想破坏最后两行,那么你可以这样做:
python calls.py | sed -e 1,6d -e '$d' | sed -e '$d'
python calls.py | awk '{ if(NR > 7) { print t }; t = $0 }'
答案 3 :(得分:0)
这可能对您有用:
sed '1,6d;$!N;$d;P;D' file
答案 4 :(得分:-1)
我不确定这是最好的方法(也许D-Link路由器有FTP或SSH支持),但你可以用awk做到这一点:
awk '/cat/, /exit/' | sed -e '1d' -e '$d'
awk将在包含“cat”和“exit”的行之间打印所有内容,不幸的是包括这两行。这就是其余命令的用途,我无法弄清楚如何做得更好......