Shell脚本-按将显示的列筛选文本文件(&;不会存在
我想根据用户的输入(例如:1218738496),根据第8列过滤一个充满日志文件的目录,并输出到文本文件。我有一个可行的解决方案,但我正在寻找一个性能更好的解决方案,因为总文件大小可能超过1GB+ 问题1: 某些行的格式不一致 问题2: 如果行的第8列与输入匹配,则它下面的行(不包含INSERT)也应输出到文件 样本数据Shell脚本-按将显示的列筛选文本文件(&;不会存在,shell,unix,Shell,Unix,我想根据用户的输入(例如:1218738496),根据第8列过滤一个充满日志文件的目录,并输出到文本文件。我有一个可行的解决方案,但我正在寻找一个性能更好的解决方案,因为总文件大小可能超过1GB+ 问题1: 某些行的格式不一致 问题2: 如果行的第8列与输入匹配,则它下面的行(不包含INSERT)也应输出到文件 样本数据 ACTION,INSTALLATION_ID,LOG_TIMESTAMP_SECONDS,LOG_TIMESTAMP_FRACTIONS,LOG_TIMESTAMP,THREA
ACTION,INSTALLATION_ID,LOG_TIMESTAMP_SECONDS,LOG_TIMESTAMP_FRACTIONS,LOG_TIMESTAMP,THREAD_ID,SEQUENCE_NUMBER,LOG_LEVEL_TYPE
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1127192896,0,DEBUG3
0010: 69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]",,default,false
INSERT,SLT_TEST_1,2015/06/02 14:07:13.305 (Asia/Colombo),1127192896,1,DEBUG1
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,14,DEBUG3
<v s=""MONTHLY_PEAK_DWNLOAD""/>
</a><a n=""thresholdScheme""><o t=""PM_UsageMonitorConfigThreshold"">
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,15,DEBUG3
0010: 69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]",,default,false
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,17,DEBUG3
操作、安装ID、日志时间戳秒、日志时间戳分数、日志时间戳、线程ID、序列号、日志级别类型
插入,SLT_测试_12015/06/02 14:07:26.860(亚洲/科伦坡),1127192896,0,调试3
0010:69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]“,,默认值,false”
插入,SLT_测试_12015/06/02 14:07:13.305(亚洲/科伦坡),1127192896,1,调试1
插入,SLT_测试_12015/06/02 14:07:26.860(亚洲/科伦坡),1218738496,14,调试3
插入,SLT_测试_12015/06/02 14:07:26.860(亚洲/科伦坡),1218738496,15,调试3
0010:69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]“,,默认值,false”
插入,SLT_测试_12015/06/02 14:07:26.860(亚洲/科伦坡),1218738496,17,调试3
期望输出
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,14,DEBUG3
<v s=""MONTHLY_PEAK_DWNLOAD""/>
</a><a n=""thresholdScheme""><o t=""PM_UsageMonitorConfigThreshold"">
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,15,DEBUG3
0010: 69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]",,default,false
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,17,DEBUG3
INSERT,SLT_TEST_12015/06/02 14:07:26.860(亚洲/科伦坡),1218738496,14,3
插入,SLT_测试_12015/06/02 14:07:26.860(亚洲/科伦坡),1218738496,15,调试3
0010:69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]“,,默认值,false”
插入,SLT_测试_12015/06/02 14:07:26.860(亚洲/科伦坡),1218738496,17,调试3
我当前的工作脚本
for file in $(ls -rt $directory)
do
echo "Reading file : " $file
# || [[ -n "$line" ]] <-- prevent last line being ignored if doesn't end with newline
while IFS= read -r line || [[ -n "$line" ]]
do
# if line contains INSERT
if [[ $line == *"INSERT"* ]]
then
# Break it to access the thread ID
breakdown=(${line//,/ })
threadID=${breakdown[4]}
if [[ $threadID == "$inputThreadID" ]]
then
seqID=${breakdown[5]}
echo $line >> ./output_unsorted.txt
fi
else
# The "too long lines" check if they belong to the ID log we want
if [ "$threadID" == "$inputThreadID" ] && [[ $line != *"ACTION,INSTALLATION_ID"* ]]
then
if [ "$lastSeqID" != "$seqID" ]
then
echo $line >> ./output_unsorted.txt
else
echo $line >> ./output_unsorted.txt
fi
fi
fi
done < "$directory/$file"
done
$中文件的(ls-rt$目录)
做
echo“正在读取文件:$file”
#| |[-n“$line”]]使用awk
这将生成您要求的输出:
$ awk -F, '/INSERT/{f=0} $4==1218738496{f=1} f' file
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,14,DEBUG3
<v s=""MONTHLY_PEAK_DWNLOAD""/>
</a><a n=""thresholdScheme""><o t=""PM_UsageMonitorConfigThreshold"">
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,15,DEBUG3
0010: 69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]",,default,false
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,17,DEBUG3
有什么能阻止你在Perl中这样做吗?在我看来,这比bash更合适。不幸的是,我只能在bash中这样做:(嗨,知道为什么这样做不起作用吗?output.txt是空的。对于$(ls-rt$2)do awk-F',/INSERT/{F=0}$4==1218738496{F=1}F'$2$file中的文件“>./output.txt完成
有几个问题。为了解决这些问题,$2
最好以一个/
结束。此外,对于找到的每个文件,所有以前的输出都将丢失,因为每次都会从头覆盖/output.txt
。(如果您希望将其附加到,请将>
替换为>
)此外,如果任何文件或目录名包含空格,则该代码将不起作用。谢谢,一旦我将>替换为>>
#!/bin/bash
f=
while IFS= read line
do
[[ $line == *"INSERT"* ]] && f=
IFS=, read a b c d rest <<<"$line"
[ "$d" = 1218738496 ] && f=1
[ "$f" ] && echo "$line"
done <file