Используя bash
и предполагая, что нет тысяч этих файлов:
rm /var/kafka/kafka-logs/**.index
mv /var/kafka/kafka-logs/**.index /var/tmp/INDEX_BACKUP
Это не будет проверять, существуют ли уже имена в месте назначения, поэтому он может перезаписать там файлы (вашими примерами файлов, вы получите только одну копию файла 00000000000000000000.index
, например ).
Обе эти команды предполагают, что параметр оболочки globstar
был установлен в bash
с помощью
shopt -s globstar
Это включает шаблон глобуса **
, который будет соответствовать как *
, но через /
в путях.
Скажи мне, подходит ли тебе это:
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
Чтобы сделать это с помощью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
для чтения и печати двух строк «после» по отдельности.