首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash脚本中读取块中的文件-块以匹配的字符串开始,当找到异常字符串时停止。

在bash脚本中读取块中的文件-块以匹配的字符串开始,当找到异常字符串时停止。
EN

Stack Overflow用户
提问于 2015-03-14 02:09:01
回答 1查看 315关注 0票数 0

我需要生成一个脚本,以便能够从“块”中的日志文件中读取行--在其中,它将接受一个示例参数(在我下面的例子中-- 'PROCESS.1234'),并搜索它直到找到匹配的对象。然后,它应该开始从查找参数的起始位置连续读取,直到满足一个不需要的参数(在本例中,任何具有“PROCESS.####”的参数)。然后,它应该在后面继续搜索相同的参数,最后一次结束。

在下面的示例中,我使用"PROCESS.7890“作为我的起始参数,然后在找到另一个"PROCESS.####”时结束该块。

上下文:我有多个进程写入一个日志文件。这些不同的过程往往有不同的名称,但为了简单起见,我将它们概括为"PROCESS“。为了排除故障,我需要将这个日志文件分成多个文件。此任务的真正问题是当进程向文件写入“错误”时。这些进程从来没有说明谁说错误是由谁写的,但是通过查找上面提到的错误消息中的第一个"PROCESS.####“,我们知道它渴望的是谁。

样本文件:

代码语言:javascript
复制
 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.####”日志。

代码语言:javascript
复制
 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“时

代码语言:javascript
复制
 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

当前长时间的工作-工作:

代码语言:javascript
复制
 #!/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/等等.

EN

回答 1

Stack Overflow用户

发布于 2015-03-14 04:17:57

grep是以ed操作g/re/p命名的,用于查找文件中包含regexp的行并打印它们,因此请使用它。不过,对于其他任何事情,只要使用awk就行了。

代码语言:javascript
复制
$ 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 here
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29044683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档