Пару полезных приёмов на 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.