2014-12-27 140 views
-1

我有一个日志文件,我想用C程序在以下文件中打印以太网地址。那我该怎么做?我的日志文件如下:是否可以打印日志文件的特定部分?

*Thu Dec 25 11:40:41 2014; ******** LAN traffic monitor started ********** LAN traffic log, generated Thu Dec 25 11:41:41 2014 


Ethernet address: 08:00:27:d7:54:fa 
    Incoming total 389 packets, 184398 bytes; 388 IP packets 
    Outgoing total 383 packets, 64444 bytes; 382 IP packets 
    Average rates:  24.58 kbps incoming,  8.59 kbps outgoing 
    Last 5-second rates:  0.86 kbps incoming,  0.45 kbps outgoing 

Ethernet address: 52:54:00:12:35:02 
    Incoming total 383 packets, 64444 bytes; 382 IP packets 
    Outgoing total 389 packets, 184398 bytes; 388 IP packets 
    Average rates:  8.59 kbps incoming,  24.58 kbps outgoing 
    Last 5-second rates:  0.45 kbps incoming,  0.86 kbps outgoing 

Running time: 60 seconds 

*** LAN traffic log, generated Thu Dec 25 11:42:41 2014 


iEthernet address: 08:00:27:d7:54:fa 
    Incoming total 395 packets, 184935 bytes; 393 IP packets 
    Outgoing total 389 packets, 64805 bytes; 387 IP packets 
    Average rates:  12.33 kbps incoming,  4.32 kbps outgoing 
    Last 5-second rates:  0.00 kbps incoming,  0.00 kbps outgoing 

Ethernet address: 52:54:00:12:35:02 
    Incoming total 389 packets, 64805 bytes; 387 IP packets 
    Outgoing total 395 packets, 184935 bytes; 393 IP packets 
    Average rates:  4.32 kbps incoming,  12.33 kbps outgoing 
    Last 5-second rates:  0.00 kbps incoming,  0.00 kbps outgoing 

Running time: 120 seconds 
+0

欢迎来到Stack Overflow。请尽快阅读[关于]页面。请注意,您的问题含糊不清,因为您尚未准确定义要从样本数据中获得的输出(但您最好包含样本数据)。展示你的尝试也是一个好主意。目前还不清楚shell脚本是否足够,或者你是否真的需要一个C程序。我希望在任务中使用'sed'或'grep',并在编写C代码完成这项工作之前使用'awk'或Perl或Python进行更复杂的处理。所有这些都是C程序;虽然它们不是自定义的C程序。 – 2014-12-27 22:05:01

+0

如果你真的需要编写C程序,正则表达式函数可能是有用的(参见你的系统上的'regcomp()','regexec()'等手册页)。 – kestasx 2014-12-27 23:36:49

回答

1

1)用fopen()打开日志文件。

2)一行一行地阅读fgets()

3)用strstr()在每行中搜索关键短语“以太网地址”。

4)用printf()打印这样的行。

5)用fclose()关闭文件。

1

什么构成日志文件的“部分”?

  • 如果你的意思包含“以太网地址”单线条,那么它很容易与grepsed

    grep 'Ethernet address' logfile 
    sed -n '/Ethernet address/p' logfile 
    
  • 如果你的意思开始“以太网地址”的行块,然后它很容易与sed和可行与GNU grep如果块的尺寸是固定的:

    sed -n '/Ethernet address/,/^$/p' logfile 
    grep -A 5 'Ethernet address' logfile 
    

    在这两个命令在输出中包含空白行。如果这不是想要的,那么:

    sed -n '/Ethernet address/,/^$/{ /^$/d; p;}' logfile 
    grep -A 4 'Ethernet address' logfile 
    
  • 如果你真的想要写一个C程序的工作,那肯定是可行的,如果你有一个体面的库来支持你的,不是很难。实际处理文件的代码少于30行(无论你想要处理块的方式),还可能有80行支持参数处理的代码等等(取决于你支持多少选项,以及程序应该如何灵活一般而言),加上库函数。这也取决于你想要'以太网地址'硬连接到C程序的有多坚固(提示:你可能不希望它硬连接到程序中)。

请注意,显示的代码将选择数据中显示的'iEthernet address'行。如果这不是拼写错误,并且不需要该块,请在Ethernet之前的每个地方使用插入符号(^)。

相关问题