Bash: подсчет всех строк во всех файлах папки и подсчет суммы данных колонки в файле

Пару полезных приёмов на bash, которые пригодятся при составлении каких либо отчетов на основе файлов и их данных.

Иногда бывает необходимо подсчитать строки во всех файлах определенной директории. Это выполнят следующие команды:

# эта команда выполнит задачу быстро даже с тысячами файлов
cat path/* | wc -l
# а вот эта выполнит ту же задачу, но отработает в десять раз медленней и с большей нагрузкой
find /path -name "*" -type f -exec wc -l {} \; | awk 'BEGIN{sum=0}{sum+=$1;}END{print sum;}'

А теперь другая задача. Предположим, у нас есть некий лог файл parser.log, в котором есть колонка с выкачанными данными и нам требуется подбить их сумму:

Dec 28 06:44:24 Use[t_JUGWAe]:    tor, Done: 50, Err:  0, ID: 2613214, Exec:  51.35s, Pars:  51.29s, DB: 0.06s
Dec 28 06:44:31 Use[t_CZxkSZ]:   good, Done: 37, Err:  3, ID: 2613264, Exec: 147.38s, Pars: 147.32s, DB: 0.06s
Dec 28 06:44:32 Use[t_JVuaCD]:    tor, Done: 50, Err:  0, ID: 2613301, Exec:  55.58s, Pars:  55.53s, DB: 0.05s
Dec 28 06:44:33 Use[t_JXbcvD]:    tor, Done: 50, Err:  1, ID: 2613351, Exec:  52.18s, Pars:  52.15s, DB: 0.03s
Dec 28 06:44:33 Use[t_Fi1Ky3]: socks4, Done: 41, Err:  9, ID: 2613401, Exec: 380.16s, Pars: 380.08s, DB: 0.08s
Dec 28 06:44:35 Use[t_CUUIUR]:  https, Done: 15, Err: 25, ID: 2613442, Exec: 628.36s, Pars: 628.32s, DB: 0.04s
Dec 28 06:44:41 Use[t_JWShpf]:    tor, Done: 50, Err:  0, ID: 2613457, Exec:  63.33s, Pars:  63.28s, DB: 0.05s
Dec 28 06:44:41 Use[t_JQVbTH]:    tor, Done: 50, Err:  0, ID: 2613507, Exec:  83.20s, Pars:  83.16s, DB: 0.04s
Dec 28 06:44:42 Use[t_Fi1Ky3]:    tor, Done:  9, Err:  0, ID: 2613557, Exec:   7.91s, Pars:   7.90s, DB: 0.01s
Dec 28 06:44:45 Use[t_CZxkSZ]:    tor, Done:  3, Err:  0, ID: 2613566, Exec:   3.16s, Pars:   3.16s, DB: 0.00s
Dec 28 06:44:47 Use[t_JbbdjL]:    tor, Done: 50, Err:  0, ID: 2613569, Exec:  58.26s, Pars:  58.23s, DB: 0.03s
Dec 28 06:44:51 Use[t_CdyNsq]:  https, Done: 17, Err: 18, ID: 2613619, Exec: 618.23s, Pars: 618.10s, DB: 0.13s
Dec 28 06:44:51 Use[t_JZ7es3]:    tor, Done: 50, Err:  0, ID: 2613636, Exec:  63.51s, Pars:  63.48s, DB: 0.03s
Dec 28 06:45:06 Use[t_DCcAug]: socks5, Done:  7, Err: 41, ID: 2613686, Exec: 613.59s, Pars: 613.58s, DB: 0.01s
Dec 28 06:45:14 Use[t_Jjxo2g]:    tor, Done: 50, Err:  0, ID: 2613693, Exec:  60.94s, Pars:  60.92s, DB: 0.02s
Dec 28 06:45:19 Use[t_Jvrc96]:    tor, Done: 50, Err:  0, ID: 2613743, Exec:  59.92s, Pars:  59.88s, DB: 0.04s
Dec 28 06:45:24 Use[t_Jw4ae5]:    tor, Done: 50, Err:  0, ID: 2613793, Exec:  60.47s, Pars:  60.45s, DB: 0.02s

Выполняем:

grep Done parser.log | sed 's/,//g' | awk 'BEGIN{sum=0}{sum+=$7;}END{print sum;}'

Кодом выше мы дергаем все строки с подстрокой Done, затем вырезаем запятые и подсчитываем сумму колонок в файле под номером 7, где находится количество из Done.

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *