Статьи

Почему Unix-утилиты стоит изучить

Почему ВИМ?

Рано или поздно наступает день, когда ваша простая в использовании 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]

Вот как это выглядит:

vim_json_one_line2

Красивая печать

Python поставляется вместе с большинством дистрибутивов Unix, поэтому выполнение следующей команды VIM позволяет добиться цели:

1
%!python -m json.tool

vim_json_pretty

Давайте сохраним распечатанный файл 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 являются хорошим напоминанием о том, что тяжелые работы требуют сложных инструментов.