Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用bash从log_file.txt中提取数据_Bash - Fatal编程技术网

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

如何使用bash从log_file.txt中提取数据,bash,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 |L

我有一个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

我遗漏了什么吗?

您基本上可以迭代您想要分类的唯一元素(在本例中,我使用了
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,但在循环中,它需要构建一个基本的regexp来查找与这两个值匹配的行,然后将它们全部发送到一个文件,该文件的名称中包含完整的键。

首先,c.f.展示你所做的努力,让其他人觉得你做了尽职调查是值得的

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

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
cut-c14-41日志文件| grep-v DeptID | sort-u|
边读键

do IFS=“$IFS |”读取dept文件夹就像您要求根据FolderIDDeptID分离所有日志数据一样,您可以通过以下方式处理输入文件(我们称之为/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

如果您需要进一步解释,请不要犹豫。

嗨,mjuarez,谢谢您的回复。我已经更新了我的问题。如果你能回复,那就太好了。非常感谢。嗨,保罗,谢谢你的回复。是的,文件夹名称是一致的。为你工作?你解决了这个问题吗?在Stackoverflow上,你可以给人们有用的答案来感谢他们,并从所有答案中选择任何一个。