0

我很少有包含一些关键词的文本文件。我必须从这些文件中选择几行并解析它。下面是一个示例文件。我必须 grep 查找“客户”并从文件中获取该行。

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 

我必须只选择具有客户的行并且必须对其进行解析以仅获取时间戳 (12:14:38) 和数字 12.14.19.9。我必须为多个文件执行此操作。所有文件都具有相同的日志结构。我已经使用下面的 oneliner 完成了此操作

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

但我需要在 shell 脚本中执行此操作。我怎样才能做到这一点。任何人都可以帮忙吗?

谢谢

4

3 回答 3

1

好的 -

这是一个快速的'n'dirty shell脚本:

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

1) 第一行检查#/命令行参数“$#”是否等于 1。如果不是,它会提示您输入文件名。

2)“awk”脚本是“cut”的替代品。当且仅当该行包含“客户”时,它才会打印出第 5 列和第 12 列。

3) "awk" 命令末尾的 $1 是 shell 参数 #1,即您的文件名。

于 2012-09-13T05:31:04.043 回答
1

这也适用于多个文件。

awk '$0~/Customer/{print $5,$12}' *.txt
于 2012-09-13T12:43:49.227 回答
0

一种使用方式GNU awk

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
于 2012-09-13T05:39:27.440 回答