user394741
user394741

Reputation: 107

Prior line should be printed if the next line starts with a particular word

How do I print a line which matches a particular pattern and the line before it?

I do have a dump like this:

Apple:Orange=9942501133;
Fault Code 9
Apple:Orange=9942501144;
Fault Code 9
Apple:Orange=9942501155;
Apple:Orange=9942501166;
Apple:Orange=9942501177;
Fault Code 9
Apple:Orange=9942501188;
Apple:Orange=9942501199;
Apple:Orange=9942501200;
Apple:Orange=9942501211;
Fault Code 9
Apple:Orange=9942501222;

The output result to be the above line of "Fault Code 9" with Fault Code 9 included:

Apple:Orange=9942501133;
Fault Code 9
Apple:Orange=9942501144;
Fault Code 9
Apple:Orange=9942501177;
Fault Code 9
Apple:Orange=9942501211;
Fault Code 9

Upvotes: 1

Views: 126

Answers (5)

Aleksey Otrubennikov
Aleksey Otrubennikov

Reputation: 1181

tr -d '\n' <yourfile | grep -E -o '[^; ]+; *Fault Code 9' | sed 's/;.*$//'

Upvotes: 0

Ether
Ether

Reputation: 53966

grep -B1 'Fault Code 9' filename.txt 

Upvotes: 0

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 798566

gawk:

/^Fault Code 9/ {
  print s
  print $0
}

{
  s = $0
}

Upvotes: 1

eduffy
eduffy

Reputation: 40224

# grep -B1 ^Fault log.txt

The -B switch means "before".

Upvotes: 3

lasseoe
lasseoe

Reputation: 56

This should do the job.

cat yourfile | perl -e 'while(<STDIN>) { if(/Fault Code 9/) { print $prev; } $prev=$_; }'

In pure shell:

cat yourfile | while read line
do
  if [ "$line" == "Fault Code 9" ]; then
    echo "$prev"
  fi
  prev=$line
done

Upvotes: 1

Related Questions