我需要生成一个脚本,以便能够从“块”中的日志文件中读取行--在其中,它将接受一个示例参数(在我下面的例子中-- 'PROCESS.1234'),并搜索它直到找到匹配的对象。然后,它应该开始从查找参数的起始位置连续读取,直到满足一个不需要的参数(在本例中,任何具有“PROCESS.####”的参数)。然后,它应该在后面继续搜索相同的参数,最后一次结束。
在下面的示例中,我使用"PROCESS.7890“作为我的起始参数,然后在找到另一个"PROCESS.####”时结束该块。
上下文:我有多个进程写入一个日志文件。这些不同的过程往往有不同的名称,但为了简单起见,我将它们概括为"PROCESS“。为了排除故障,我需要将这个日志文件分成多个文件。此任务的真正问题是当进程向文件写入“错误”时。这些进程从来没有说明谁说错误是由谁写的,但是通过查找上面提到的错误消息中的第一个"PROCESS.####“,我们知道它渴望的是谁。
样本文件:
PROCESS.7890 Event A
PROCESS.1234 Event 1
ERROR: Abort: Some 2
.................. 3
ERROR: Abort: Some 4
PROCESS.4567 Event !
.................. !
PROCESS.7890 Event B
ERROR: Abort: Some C
PROCESS.1234 Event 5
PROCESS.4567 Event !
PROCESS.7890 Event D
PROCESS.1234 Event 6
PROCESS.4567 Event !
PROCESS.7890 Event E
PROCESS.1234 Event 7
PROCESS.7890 Event F
.................. G
ERROR: Abort: Some H预期结果-当搜索"PROCESS.1234“时。请注意,“随机切换”没有"PROCESS.####“,但它属于'1234‘,因为它是出现在错误之前的第一个"PROCESS.####”日志。
PROCESS.1234 Event 1
ERROR: Abort: Some 2
.................. 3
ERROR: Abort: Some 4
PROCESS.1234 Event 5
PROCESS.1234 Event 6
PROCESS.1234 Event 7预期结果-搜索"PROCESS.7890“时
PROCESS.7890 Event A
PROCESS.7890 Event B
ERROR: Abort: Some C
PROCESS.7890 Event D
PROCESS.7890 Event E
PROCESS.7890 Event F
.................. G
ERROR: Abort: Some H当前长时间的工作-工作:
#!/bin/bash
FILE_NAME=pids.txt
process_pid="PROCESS.1234"
#Read the Sample Log, line by line.
#Using "~" to avoid the 'for' loop breaking up strings
for line_in_file in $(cat $FILE_NAME|tr " " "~"); do
#Read the line and determine if said line starts a block
if [ "$(echo $line_in_file|grep `echo $process_pid|cut -d'.' -f1`)" ]; then
#If it starts a block, does it pertain to the PROCESS.PID in Question
if [ "$(echo $line_in_file|grep $process_pid)" ]; then
echo $line_in_file |tr "~" " " >> file_name.log
block=true
else
block=false
fi
# If part of the block, echo it
elif [ "${block}" = "true" ]; then
echo $line_in_file |tr "~" " " >> file_name.log
fi
done正如您所看到的,这是生成这些错误/其他行的一种非常低效率的方法。有没有更干净更有效的方法来做这件事..。例如用于grep的附加标志或运行/管道的备用命令?或者用酷酷超酷的单线和awk/grep/sed/等等.
发布于 2015-03-14 04:17:57
grep是以ed操作g/re/p命名的,用于查找文件中包含regexp的行并打印它们,因此请使用它。不过,对于其他任何事情,只要使用awk就行了。
$ awk -v pid=1234 '$1=="PROCESS."pid{ if (f) {print;f=0} else {f=1} } f' file
PROCESS.1234 Event Log here
ERROR: Abort: Some Error
PROCESS.1234 Event Log here
$ awk -v pid=7890 '$1=="PROCESS."pid{ if (f) {print;f=0} else {f=1} } f' file
PROCESS.7890 Event Log here
PROCESS.1234 Event Log here
ERROR: Abort: Some Error
PROCESS.1234 Event Log here
PROCESS.7890 Event Log herehttps://stackoverflow.com/questions/29044683
复制相似问题