2014-12-27 40 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之前的每個地方使用插入符號(^)。

相關問題