Пропустить две строки, если совпадение найдено в sed

Используя bashи предполагая, что нет тысяч этих файлов:

  1. rm /var/kafka/kafka-logs/**.index

  2. mv /var/kafka/kafka-logs/**.index /var/tmp/INDEX_BACKUP

    Это не будет проверять, существуют ли уже имена в месте назначения, поэтому он может перезаписать там файлы (вашими примерами файлов, вы получите только одну копию файла 00000000000000000000.index, например ).

Обе эти команды предполагают, что параметр оболочки globstarбыл установлен в bashс помощью

shopt -s globstar

Это включает шаблон глобуса **, который будет соответствовать как *, но через /в путях.

0
29.11.2019, 04:18
2 ответа

Скажи мне, подходит ли тебе это:

grep -B1 -A2 "loss" pingFailed.txt > pingFailed1.txt

Выход:

--- 4.2.2.2 ping statistics ---
10 packets transmitted, 9 received, 10% packet loss, time 18034ms
rtt min/avg/max/mdev = 20.560/34.013/70.076/17.428 ms
Tue 26 Nov 09:40:46 GMT 2019

Найдите строку с паттерном "пропажа":

grep "loss"

Печатать одну строку B перед:

-B1

Печать двух строк A после:

-A2
4
28.01.2020, 02:17

Чтобы сделать это с помощьюsed:

sed -n '/loss/ { x; G; N; N; p; s/.*// }; x' pingFailed.txt > pingFailed1.txt

Пояснение:

  • -n:Ничего не печатать автоматически; печатать только при наличии команды p rint.
  • /loss/ { … }:Выполните команды внутри фигурных скобок когда вы видите строку, содержащую «loss».
  • x:Поменяйте местами пространство шаблона и пространство удержания. Пространство шаблона содержит строку, которую мы только что прочитали. Внимание, спойлер :пробел содержит предыдущую строку. После этой команды пространство шаблонов содержит предыдущую строку а пространство для хранения содержит текущую строку.
  • G:Получить содержимое области удержания и добавьте к нему пространство шаблонов (, вставив между ними новую строку ). После этой команды пространство шаблона содержит предыдущую строку за которой следует текущая строка (, т. е. строка lossи строка перед ней ).
  • N:Прочитать другую строку из ввода и добавьте его в пространство шаблонов (, вставив между ними новую строку ).
  • p:Печать пространства шаблона, который на данный момент содержит строку loss, строку перед ней и две строки после нее.
  • s/.*//:Очистите пространство шаблона.
  • x:Поменяйте местами пространство шаблона и пространство удержания. Обратите внимание, что эта команда выполняется независимо от того, совпадает ли lossили нет.
    • Если совпало loss, мы только что выполнили все команды внутри фигурных скобок {}(, перечисленных выше ), поэтому пространство шаблона пусто. Таким образом, это устанавливает пустое пространство для хранения. (Я не уверен, что это действительно необходимо, но, вероятно, это хорошая идея.)
    • Если lossне совпало, пространство шаблонов содержит текущую строку; так что это помещает текущую строку в пространство удержания.

Насколько я могу судить, это работает отлично, если ввод такой, как вы описываете.

  • Если первая строка ввода содержит loss, то это напечатает пустую строку и первые три строки ввода (т. е. строка lossи две строки после нее ).
  • Если последняя или вторая от -до -последняя строка ввода содержит loss, то это не будет печатать его, потому что после строки lossнет двух строк — потому что sedпрерывает последовательность команд когда он встречает конец файла. Если вы хотите обработать этот случай, напечатав строку loss, строка перед ней и (одиночная )строка после нее (если есть ), сделайте это:

    sed -n '/loss/ { x; G; p; n; p; n; p; s/.*// }; x' pingFailed.txt > pingFailed1.txt
    

    для чтения и печати двух строк «после» по отдельности.

1
28.01.2020, 02:17

Теги

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