bash中的多行模式匹配

时间:2017-05-24 09:59:32

标签: bash awk

我有一个类型为

的长文件
Processin SCRIPT10 file..
Submitted batch job 1715572
Processin SCRIPT100 file..
Processin SCRIPT1000 file..
Submitted batch job 1715574
Processin SCRIPT10000 file..
Processin SCRIPT10001 file..
Processin SCRIPT10002 file..
Submitted batch job 1715577
Processin SCRIPT10003 file..
Submitted batch job 1715578
Processin SCRIPT10004 file..
Submitted batch job 1715579

我想找出未提交的作业(脚本名称)。这意味着在处理线之后没有线提交批处理作业。

到目前为止,我已尝试使用

执行该任务
pcregrep -M "Processin.*\n.*Processin" execScripts2.log | awk 'NR % 2 == 0'

但是当多个脚本没有得到处理时,它无法正确处理这种情况。令人惊讶的是,它仅输出SCRIPT1000和SCRIPT10001线。你能告诉我一个更好的单行吗?

理想情况下,输出只是下一行(或只是脚本名称)上没有“已提交”的行,这意味着:

SCRIPT100
SCRIPT10000
SCRIPT10001

感谢。

2 个答案:

答案 0 :(得分:3)

这个awk可以胜任:

awk -v s='Submitted' '$1 != s{if(p != "") print p; p=$2} $1 == s{p=""}' file

SCRIPT100
SCRIPT10000
SCRIPT10001

参考: Effective AWK Programming

答案 1 :(得分:0)

不使用awk,您可以编写一个bash命令/文件并运行它。如果您对awk的了解较少,那么如果您想进一步自定义,则此bash脚本的效果会更好。

#!/bin/bash


tempText=""
Processing="Processin"

while read line
do
  tempText=$line
  if [[ "$line" == Processin* ]];
  tempText=$line
  then
        read line
        if [[ "$line" != Submitted* ]];
        then
                echo $tempText
                tempText=$line
                while read line
                do
                        if [[ "$line" != Submitted* ]];
                        then
                                echo $tempText
                                tempText=$line
                        else
                                break
                        fi
                done
        fi
  fi

使用./check.sh filename

运行

目前的答案很好。