Покажите строки, соответствующие шаблону и этим 4 строкам перед каждым

XFS является горным телом и был в ядре целую вечность. Исследуйте инструменты как xfs_freeze и посмотрите, является ли это тем, что Вы ищете. Я знаю, что это очень субъективно, но я использовал XFS для хранения данных в течение многих лет без инцидента.

4
11.10.2011, 20:11
3 ответа

Предположим, Вы находитесь в пожилой системе, как HP-UX, который не имеет утилит GNU, просто старый, исходный BSD или AT&T "grep". Вы могли сделать что-то вроде этого:

#!/bin/sh

awk '/ORA-/ { print line1; print line2; print line3; print line4; print $0 }\
// {line1 = line2; line2 = line3; line3 = line4; line4 = $0}' $1

Да, существуют тонны граничных условий, в которых это не разбирается, но whatta ya не хотят ни для чего? Кроме того, учитывая, что Вы работаете над некоторым decroded, устаревшей ОС и аппаратными средствами, у Вас, вероятно, нет лошадиной силы ЦП для необычной обработки ошибок.

4
27.01.2020, 20:46

-B опция к grep делает точно что: grep -B 4 ORA- your_file.

В отсутствие GNU grep, Я адаптировался grep4 пример из гримуара sed учебное руководство:

#!/bin/sh

# grepB4: prints out 4 lines before and the line including pattern
# if there is only one argument, exit

case $# in 
    1);;
    *) echo "Usage: $0 pattern";exit;;
esac;

sed -n '
'/"$1"/' !{
    # does not match - add this line to the hold space
    H
    # bring it back into the pattern space
    x
    # Two lines would look like .*\n.*
    # Three lines look like .*\n.*\n.*
    # Delete extra lines - keep four
    s/^.*\n\(.*\n.*\n.*\n.*\)$/\1/
    # put it back in hold space
    x
}
'/"$1"/' {
    # matches - append the current line
    H
    # bring hold space contents into pattern space
    g
    # print the 4 lines
    p
    # add the mark
    a\
---
}'

Использование: grepB4 pattern < file.

Ответ Bruce Ediger делает по существу то же самое с awk, который часто имеет менее загадочный синтаксис, чем sed.

10
27.01.2020, 20:46
  • 1
    Насколько я знаю, что эта опция только присутствует в GNU grep. Солярис каждый не делает. выпуск 11i –  rahmu 11.10.2011, 17:49
  • 2
    HP-UX: grep-B 4 РТА - I8010.LOG grep: недопустимая опция - B –  Javier Ortega 11.10.2011, 18:28
awk 'NR == FNR && $0 ~ p {
  for (i = FNR; i >= FNR - l; i--)
    nr[i]; next
  }
FNR in nr  
BEGIN {
  ARGV[ARGC++] = ARGV[ARGC - 1]
  }' l=4 p=ORA- infile   

На Солярисе используют nawk или/usr/xpg4/bin/awk.

1
27.01.2020, 20:46

Теги

Похожие вопросы