Извлечение определенных строк из файла журнала с помощью grep и awk

Максимальная длина командной строки - это общий размер в байтах, а не количество аргументов. Файлы размером 40 КБ с именами вида / imr_report_repo / * означают минимум около 800 КБ, возможно, больше. Это выше предела.

Очевидное решение - заставить find выполнить рекурсию за вас. Переходите от глубины 1 к глубине 1 вместо глубины 0 до глубины 0.

find /imr_report_repo/ -mindepth 1 -maxdepth 1 -type f -mtime +15 -delete

В отличие от оригинала сюда входят файлы, имена которых начинаются с . (точечные файлы). Если вы этого не хотите, исключите их:

find /imr_report_repo/ -mindepth 1 -maxdepth 1 -name '.*' -prune -o -type f -mtime +15 -delete

Большинство находят реализации, которые имеют -maxdepth , также имеют -delete . Если у вас нет, не просто перенаправляйте результат в при чтении : он несколько медленный и разбивается на имена файлов, содержащие символы новой строки (и обратную косую черту и конечные пробелы, потому что вы использовали read , где вы должны были использовать IFS = read -r ). Используйте -exec , вот для чего он нужен.

find /imr_report_repo/ -mindepth 1 -maxdepth 1 -type f -mtime +15 -exec rm -f {} +

1
18.03.2019, 05:16
2 ответа

Вам нужно использовать awk, как показано ниже. Сначала сохраните URL-адрес в переменной, а затем в строке Status, если он OKполучает имя файла из следующей строки. Это должно работать в GNU awk, так как функции match()потребуется третий аргумент для сохранения захваченной группы в массиве.

awk '/^--/{ url = $NF } 
    /^[[:space:]]+Status/ && $NF == "OK" { getline nextline; match(nextline, /filename="(.+)"/,arr); print url, arr[1] }' file
1
27.01.2020, 23:42
i=`awk '/Status: 200 OK/{x=NR+1}(NR<x){getline;print $NF}' filename | awk -F "=" '{print $NF}'| sed 's/"//g'`

awk '{a[++i]=$0}/Status: 200 OK/{for(x=NR-7;x<=NR;x++)print a[x]}' filename | awk -v i="$i" '/https:/{$1=$2="";print $0 " " i}'

выход

https://www.example/download/123456789 myfile123.zip
0
27.01.2020, 23:42

Теги

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