如何使用bash从log_file.txt中提取数据
我有一个master_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
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文件夹就像您要求根据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
如果您需要进一步解释,请不要犹豫。嗨,mjuarez,谢谢您的回复。我已经更新了我的问题。如果你能回复,那就太好了。非常感谢。嗨,保罗,谢谢你的回复。是的,文件夹名称是一致的。为你工作?你解决了这个问题吗?在Stackoverflow上,你可以给人们有用的答案来感谢他们,并从所有答案中选择任何一个。