Почему ВИМ?
Рано или поздно наступает день, когда ваша простая в использовании IDE становится бесполезной для обработки больших файлов. Существует не так много редакторов, способных работать с очень большими файлами, например, с производственными журналами.
Недавно мне пришлось проанализировать однострочный файл JSON размером 100 МБ, и VIM еще раз спас день. VIM, как и многие другие утилиты Unix, является одновременно жестким и блестящим. Интерактивная перебазировка Git требует, чтобы вы знали это, и если вы все еще не уверены, возможно, эта замечательная статья заставит вас передумать.
Давайте посмотрим, как легко вы можете распечатать JSON-файл с помощью VIM. Сначала мы загрузим однострочный файл JSON из Reddit.
01
02
03
04
05
06
07
08
09
10
11
|
$ wget http: //www .reddit.com /r/programming .json --2014-01-24 12:21:04-- http: //www .reddit.com /r/programming .json Resolving www.reddit.com (www.reddit.com)... 77.232.217.122, 77.232.217.113 Connecting to www.reddit.com (www.reddit.com)|77.232.217.122|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 28733 (28K) [application /json ] Saving to: `programming.json' 100%[======================================>] 28,733 --.-K /s in 0.03s 2014-01-24 12:21:04 (1021 KB /s ) - `programming.json' saved [28733 /28733 ] |
Вот как это выглядит:
Красивая печать
Python поставляется вместе с большинством дистрибутивов Unix, поэтому выполнение следующей команды VIM позволяет добиться цели:
1
|
%!python -m json.tool |
Давайте сохраним распечатанный файл JSON и применим другие инструменты Unix.
1
|
:w programming_pretty.json |
Время совпадения
Допустим, мы хотим извлечь все значения, относящиеся к домену:
1
|
"domain" : "mameworld.info" |
Sed на помощь
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
$ sed -nr 's/^.*"domain":\s*"(.*?)".*$/\1/p' <programming_pretty.json | sort -u blog.safaribooksonline.com chadfowler.com cyrille.rossant.net dot.kde.org evanmiller.org fabiensanglard.net galileo.phys.virginia.edu github.com halffull.org ibuildings. nl jaxenter.com jobtipsforgeeks.com kilncode.com libtins.github.io mameworld.info miguelcamba.com minuum.com notes.tweakblogs.net perfect-pentago.net periscope.io reuters.com tech.blog.box.com tmm1.net vocalbit.com youtube.com |
Многострочное сопоставление
Sed ориентирован на строки, и хотя он предлагает поддержку нескольких строк, он не подходит для Perl. Допустим, я хочу сопоставить всех авторов в следующем шаблоне JSON:
1
2
3
|
"data" : { "author" : "justrelaxnow" , } |
Вот как я это делаю:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
$ perl -0777 -n -e 'print "$2\n" while (m/("data":\s*\{.*?"author":\s*"(.*?)"[,|\s*\}].*?\},)/sgmp)' programming_pretty.json | sort -u AmericanXer0 azth bionicseraph bit_shiftr charles_the_hard Gexos jakubgarfield johnwaterwood joukoo justrelaxnow Kingvash krets mariuz mopatches nyphrex pseudomind rluecke3 sltkr solidus-flux steveklabnik1 sumstozero swizec vocalbit Wolfspaw |
Вывод
Инструменты Unix — это старая школа, некоторые из которых написаны сорок лет назад. Кривая обучения может быть крутой, но изучение их — большая инвестиция. Отличная библиотека программного обеспечения выдерживает испытание временем, а инструменты Unix являются хорошим напоминанием о том, что тяжелые работы требуют сложных инструментов.