2012-09-13 146 views
0

我有幾個關鍵詞的文本文件。我必須從這些文件中選擇幾行並解析它。以下是一個示例文件。我必須grep「客戶」,並從文件中獲取該行。使用shell腳本解析文本

13 Sun Sep 9 12:14:38 2012 : [P] Reproducer has the 167 number 
13 Sun Sep 9 12:14:38 2012 : [P] Customer has the 12.14.19.9 
13 Sun Sep 9 12:14:38 2012 : [P] Customer has the 12.14.89.9 
13 Sun Sep 9 12:14:38 2012 : [P] Reproducer has the 170 number 
13 Sun Sep 9 12:14:38 2012 : [P] Customer has the 12.4.89.16 

我只有選擇具有客戶的線條和必須分析它僅獲得時間戳(十二時14分38秒)和數字12.14.19.9。我必須爲多個文件執行此操作。所有文件都具有相同的日誌結構。我已經做了這樣的使用下面的線索

grep Customer Neigh.log | cut -d " " -f 5- | cut -d ":" -f 1-4 | cut -d " " -f 1,8 

但我需要在一個shell腳本內做到這一點。我怎樣才能做到這一點。誰能幫忙?

感謝

+0

看起來你已經*寫過你的腳本。問:你需要做什麼,你還沒有做?你已經擁有了什麼?你還需要什麼? – paulsm4

+0

它工作正常..但我需要給文件名作爲參數在shell腳本和實現相同的功能..我沒有使用shell腳本。所以只是想知道如何在shell腳本中做到這一點.. – user1667228

回答

0

方式一:

for i in *.txt; do awk '/Customer/ { print $5, $NF > FILENAME".out" }' "$i"; done 

如果您正在使用BSD awk

for i in *.txt; do awk '/Customer/ { out=FILENAME".out"; print $5, $NF > out }' "$i"; done 
1

OK -

這裏有一個quick'n'dirty shell腳本:

if [ $# -ne 1 ]; then 
    echo Please enter a filename 
else 
    awk '/Customer/ {print $5, " ", $12}' $1 
fi 

1)第一線檢查,如果#/命令行參數 「$#」 是等於1.否則,它會提示您輸入文件名。

2)「awk」腳本是「剪切」的替代方法。它打印出列5和12,當且僅當該行包含「客戶」時。

3)「awk」命令末尾的$ 1是shell參數#1,即文件名。使用GNU awk

+0

!!!有用 !!!我如何循環這個多個文件。就像我需要給變量數量的參數作爲文件名,並在每個文件中我需要做同樣的操作。基本上我需要遍歷參數的數量,並將每個輸出的輸出保存在單獨的輸出文件中。你能請單獨幫忙嗎..在此先感謝.. – user1667228

+0

你不需要循環多個文件。您可以將#/參數的檢查更改爲'if [$#-lt 1]',並將「$ 1」更改爲「'$ *'」。這將允許您在一個命令中指定多個文件..或通配符..如果您發現回覆有幫助,請確保提供「upvote」。 – paulsm4

+0

:)完成!謝謝 – user1667228

1

這適用於多個文件了。

awk '$0~/Customer/{print $5,$12}' *.txt