2012-09-13 113 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