awk和cat - 如何忽略多行?

时间:2011-01-10 01:31:06

标签: filter sed awk cat

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

谢谢,抱歉我的英语不好。

5 个答案:

答案 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)

python calls.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 }'

答案 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”的行之间打印所有内容,不幸的是包括这两行。这就是其余命令的用途,我无法弄清楚如何做得更好......