используя sed для поиска первых 3 и 3 последних вхождений всех файлов - PullRequest
0 голосов
/ 08 ноября 2019

Каков наилучший способ поиска строчек в верхних 3 и нижних 3 во всех файлах каталога и вывода результата в файл?

В настоящее время я делаю это с помощью 2 команд,Но есть ли лучший способ?

grep string path-to-file | head -3 > out.log
grep string path-to-file | tail -3 >> out.log

Ответы [ 3 ]

1 голос
/ 08 ноября 2019

Это можно сделать за один вызов awk, например:

awk -v n=3 '
FNR == 1 && NR != 1 {
    i = ((c - n) >= n ? c - n : n) + 1 
    for (; i <= c; i++)
        print m[i]   
    c = 0 
    delete m
}
/pattern to match/ {
    c++
    if (c <= n)
        print
    else {
        delete m[c - n]
        m[c] = $0
    }
}
END {
    i = ((c - n) >= n ? c - n : n) + 1 
    for (; i <= c; i++)
        print m[i]
}' *
0 голосов
/ 09 ноября 2019

Это может сработать для вас (GNU sed):

sed -nE '/PATTERN/H;$!d;x;s/^((\n[^\n]*){3}).*((\n[^\n]*){3})$/\1\3/;s/.//p' file

Соберите строки, содержащие PATTERN в области удержания и в конце файла, поменяйте местами в область удержания, удалите всестроки между первой и последней тремя строками, удалите введенную новую строку и напечатайте в случае успеха.

0 голосов
/ 09 ноября 2019

Если вы все еще заинтересованы:

see -n '
    /PATTERN/!{$be;d};
    1h;1!H;
    :e;
    ${g;s,^\([\n]\+\n[\n]\+\n[\n]\+\n\).*\([\n]\+\n[\n]\+\n[\n]\+\),\1\2,;p}
'

Идея такова:

  1. игнорировать все строки, которые не содержат шаблон PATTERN.
  2. чтобы сохранить все строки, содержащие PATTERN, в области удержания
  3. , чтобы прочитать пространство удержания в конце и сохранить первые 3 строки в первой группе и последние 3 строки во второй группе

У меня нет доступа к компьютеру сейчас, я проверю его позже и исправлю при необходимости

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...