Как выбрать 3 строки выше подобранного параметра

Измените настройки страны на ja_JP Японский в Puppy Quick Setup, затем перезапустите X.

В настройках страны для Японии Ctrl-пробел вызовет отображение панели SCIM.

0
05.08.2018, 16:03
2 ответа

Простой, но не обязательно эффективный:

tac Services.log | awk '/exception/ {L = NR + 4} NR < L' | tac
0
28.01.2020, 02:31

Следующая команда awkдаст вам строку, содержащую строку exceptionвместе с тремя строками «до контекста»(-B 3с GNU grepи некоторыми другими grepреализациями):

awk 'BEGIN { bc=3 } { lines[NR%(bc+1)] = $0 } /exception/ { for (i=1; i<=(bc+1); ++i) print lines[(NR+i)%(bc+1)] }' file

Это сохраняет «круговой буфер», lines, из bc+1строк, где bc— количество строк «до контекста», которое вы хотите. Когда строка соответствует шаблону exception, печатается содержимое этого буфера.

Это неправильно обрабатывает случай, когда совпадение происходит внутри «до контекста» другого совпадения, или когда первое совпадение в файле встречается менее чем bcстрок в файле.

Обобщается в скрипт, который дает вам настраиваемый объем контекста до и после некоторого шаблона:

#!/bin/sh

# Usage:
#   ./script [ -A n ] [ -B n ] PATTERN FILE...

after=0
before=0

while getopts 'A:B:' opt; do
    case $opt in
    A)
        after=$OPTARG
        ;;
    B)
        before=$OPTARG
        ;;
    *)
        echo 'error in command line parsing' >&2
        exit 1
    esac
done
shift "$(( OPTIND - 1 ))"

pattern=$1
shift

pattern=$pattern awk -v bc="$before" -v ac="$after" '
    { lines[NR%(bc+1)] = $0 }
    $0 ~ ENVIRON["pattern"] {
        for (i=1; i<=(bc+1); ++i) print lines[(NR+i)%(bc+1)]
        print_after=ac
        next
    }
    print_after > 0 { print; print_after-- }' "$@"

Проверка:

$ cat file
1
2
3
4
5
exception
6
7
8
9
0
exception
$ sh script.sh -B 3 exception file
3
4
5
exception
8
9
0
exception
$ sh script.sh -A 3 exception file
exception
6
7
8
exception
$ sh script.sh -A 1 -B 1 exception file
5
exception
6
0
exception
2
28.01.2020, 02:31

Теги

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