如何使用bash从log_file.txt中提取数据

时间:2018-10-24 14:21:17

标签: bash

我有一个master_log_file.txt,序列如下:

TransferDate|DeptID|FolderID             |DocID |AFPFileName|NoOfAcct| 
20181024    |1     |LRREM1.20181015.CGLOG|test  |xxxx       |12
20181024    |2     |LRREM2.20181013.CGLOG|home  |XyyX       |2
20181024    |3     |LRREM3.20181013.CGLOG|office|xy         |5
20181024    |4     |LRREM4.20181013.CGLOG|store |yy         |10

我想创建一个bash文件,根据FolderID和DeptID将所有日志数据分离到单独的日志文件中。有人可以给我一个关于如何执行此操作的示例,因为我不熟悉此批处理产品。提前致谢。 根据mjuarez的建议,下面是我的bash文件。

echo off
for folder in `grep -v TransferDate log_test.txt | cut -d "|" -f3 | sort | uniq`; do 
   grep ${folder} separated.txt > F:/Work/FLP Code/test/folder_${folder}.txt; 
done
pause

我想念什么吗?

3 个答案:

答案 0 :(得分:1)

首先,请参见this link展示您的尝试,并使其他人有时间值得您去做您的尽职调查。

第二:该格式是否一致?它显然是格式化的,所以我假设它是

cut -c 14-41 logFile | grep -v DeptID | sort -u |
  while read key
  do IFS="$IFS|" read dept folder <<< "$key";
     grep "$key" < logFile > $folder.$dept;
  done

14-41是您提到的键的范围,我用cut拉。

使用grep -vsort -u将标题剥离,以获得定义每个输出文件的一组独特组合。通过管道将其传送到while读取循环。

为$ IFS的临时分配添加管道字符,以将部门和文件夹分配给var(我用来为输出创建不同的文件名),然后grep将每个组合的键分配到相关文件。

您需要做什么吗?

我看到有人击败了我,但是我不认为文件夹值总是一致的,因为您分别提到了dept。

答案 1 :(得分:1)

就像您要求根据FolderID DeptID分隔所有日志数据一样,您可以处理输入文件(我们称其为 /tmp/log_file.txt )这样:

#!/bin/bash

for key in $( cat /tmp/log_file.txt |sed -e 's/[ \t]//g;' |awk -F '|' '{print $2"_"$3}' |sort -u ); do
  fileName="$key"
  filter=$( echo "$key" |sed -e "s/\([^_]*\)_\(.*\)$/\1[ \t]*|\2/" )
  grep -re "$filter" /tmp/log_file.txt > "/tmp/$fileName"
done

如果您需要进一步的说明,请不要犹豫。

答案 2 :(得分:0)

您基本上可以遍历要分类的唯一元素(在这种情况下,我使用了FolderID列),并使用grep仅将这些记录发送到自己的文件中。

for folder in `grep -v TransferDate file.txt | cut -d "|" -f3 | sort | uniq`; do 
   grep ${folder} file.txt > /tmp/folder_${folder}.txt; 
done

这将创建以下文件:

folder_LRREM1.20181015.CGLOG.txt  folder_LRREM3.20181013.CGLOG.txt
folder_LRREM2.20181013.CGLOG.txt  folder_LRREM4.20181013.CGLOG.txt

您可以更改循环中的首字母grep,以完全使用所需的唯一字段或字段组合。

已更新:

这是已完成的脚本,其中考虑了两个字段,并为每个类别分别创建了文件:

for key in `cat file.txt | grep -v FolderID | awk 'BEGIN { FS="|"} { print $3 "_" $4 }' | sort | uniq` ; do
   value1=`echo $key | cut -d_ -f1`
   value2=`echo $key | cut -d_ -f2`
   grep -E "${value1}.*\|${value2}" file.txt > /tmp/key_${key}.txt;
done

它的工作方式与第一个有所不同。它需要通过两个键进行grep操作,但是在循环中,它需要构建一个基本的正则表达式来查找与这两个值都匹配的行,然后将它们全部发送到以全键作为其名称一部分的文件中。