1

我需要从 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。

谢谢,对不起我的英语不好。

4

5 回答 5

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 什么都不需要。为什么要让事情变得比他们需要的更复杂?

于 2011-01-10T02:34:40.500 回答
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 脚本不读取文件并进行过滤(而不是调用外部实用程序)?

于 2011-01-10T02:35:36.637 回答
0

python 调用.py | sed -e 1,6d -e '$d'


所以这可能会奏效。它将过滤掉前 6 个和最后一个,这是您的示例表明您需要的。如果你真的想破坏最后两行,那么你可以这样做:

python calls.py | sed -e 1,6d -e '$d' | sed -e '$d'

但是等等……你说 awk,所以……

python calls.py | awk '{ if(NR > 7) { print t }; t = $0 }'
于 2011-01-10T01:36:10.433 回答
0

这可能对您有用:

sed '1,6d;$!N;$d;P;D' file
于 2012-03-15T18:36:20.417 回答
-1

我不确定这是不是最好的方法(也许 D-Link 路由器支持 FTP 或 SSH),但你可以用 awk 来做:

awk '/cat/, /exit/' | sed -e '1d' -e '$d'

awk 将打印包含“cat”和“exit”的行之间的所有内容,不幸的是包括这两行。这就是剩下的命令的用途,我想不出比这更好的方法......

于 2011-01-10T01:47:53.590 回答