<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Кибер-Фанк v2.0 &#187; awk</title>
	<atom:link href="http://www.shatlovsky.ru/category/awk/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.shatlovsky.ru</link>
	<description>Information must be free</description>
	<lastBuildDate>Fri, 12 Aug 2011 09:06:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Unix: Поиск и замена во многих файлах одновременно</title>
		<link>http://www.shatlovsky.ru/2009/02/09/poisk-i-zamena-vo-mnogix-fajlax-odnovremenno/</link>
		<comments>http://www.shatlovsky.ru/2009/02/09/poisk-i-zamena-vo-mnogix-fajlax-odnovremenno/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 14:15:10 +0000</pubDate>
		<dc:creator>Alex Shatlovsky</dc:creator>
				<category><![CDATA[awk]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[grep]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[replace]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://www.shatlovsky.ru/?p=75</guid>
		<description><![CDATA[Задача: найти все файлы содержащие OLDTEXT, и заменить OLDTEXT на NEWTEXT. UPD2:Решение, предложенное ocehb: grep -rl OLDTEXT . &#124; grep -Ev '(~&#124;.o&#124;.a)$' &#124; grep -Ev '/.svn/' &#124; xargs perl -i -pe &#34;s/OLD_TEXT/NEW_TEXT/g;&#34; UPD1:Вариант без vim: grep -HR OLDTEXT ./ &#124; awk '{print $1}' &#124; sed 's/:.*$//' &#124; grep -v '~' &#124; sort &#124; uniq &#124; [...]]]></description>
			<content:encoded><![CDATA[<p>Задача: найти все файлы содержащие <em>OLDTEXT</em>, и заменить <em>OLDTEXT</em> на <em>NEWTEXT</em>.</p>
<p><strong>UPD2:</strong>Решение, предложенное <a href="http://ocehb.livejournal.com/51745.html">ocehb</a>:</p>
<pre class="bash"><span style="color: #c20cb9; font-weight: bold;">grep</span> -rl OLDTEXT . | <span style="color: #c20cb9; font-weight: bold;">grep</span> -Ev <span style="color: #ff0000;">'(~|.o|.a)$'</span> | <span style="color: #c20cb9; font-weight: bold;">grep</span> -Ev <span style="color: #ff0000;">'/.svn/'</span> | <span style="color: #c20cb9; font-weight: bold;">xargs</span> <span style="color: #c20cb9; font-weight: bold;">perl</span> -i -pe <span style="color: #ff0000;">&quot;s/OLD_TEXT/NEW_TEXT/g;&quot;</span></pre>
<p><strong>UPD1:</strong>Вариант без vim:</p>
<pre class="bash"><span style="color: #c20cb9; font-weight: bold;">grep</span> -HR OLDTEXT ./ | <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print $1}'</span> | <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">'s/:.*$//'</span> | <span style="color: #c20cb9; font-weight: bold;">grep</span> -v <span style="color: #ff0000;">'~'</span> | <span style="color: #c20cb9; font-weight: bold;">sort</span> | <span style="color: #c20cb9; font-weight: bold;">uniq</span> | <span style="color: #c20cb9; font-weight: bold;">xargs</span> <span style="color: #c20cb9; font-weight: bold;">perl</span> -i -pe <span style="color: #ff0000;">&quot;s/OLD_TEXT/NEW_TEXT/g;&quot;</span></pre>
<p>Изначально предложенное решение с vim:</p>
<pre class="bash"><span style="color: #c20cb9; font-weight: bold;">grep</span> -HR OLDTEXT ./ | <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print $1}'</span> | <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">'s/:.*$//'</span> | <span style="color: #c20cb9; font-weight: bold;">grep</span> -v <span style="color: #ff0000;">'~'</span> | <span style="color: #c20cb9; font-weight: bold;">sort</span> | <span style="color: #c20cb9; font-weight: bold;">uniq</span> | <span style="color: #c20cb9; font-weight: bold;">xargs</span> vim -p</pre>
<p>В открывшемся окне <code>vim</code> командуем:</p>
<pre class="bash">:tabdo %s/OLDTEXT/NEWTEXT/g</pre>
<p> (заменить OLDTEXT на NEWTEXT во всех вкладках)</p>
<pre class="bash">:xa</pre>
<p> (записать изменения во всех вкладках)<br />
либо</p>
<pre class="bash">:qa!</pre>
<p> (отменить изменения во всех вкладках)</p>
<p>Ссылки по теме:</p>
<ol>
<li><a href="http://vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl">VIM FAQ</a></li>
<li><a href="http://vim.wikia.com/wiki/Save_all_open_buffers_at_once">Save all open buffers at once</a></li>
<li><a href="http://linsovet.com/vim-sudo">Сохранение файла без прав на запись в vim используя sudo</a></li>
<li><a href="http://mailman.lug.org.uk/pipermail/scarborough/2004-December/001792.html">[SLUG] Vim. Search and replace in multiple files</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.shatlovsky.ru/2009/02/09/poisk-i-zamena-vo-mnogix-fajlax-odnovremenno/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>vim tabs</title>
		<link>http://www.shatlovsky.ru/2008/10/01/vim-tabs/</link>
		<comments>http://www.shatlovsky.ru/2008/10/01/vim-tabs/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 14:08:17 +0000</pubDate>
		<dc:creator>Alex Shatlovsky</dc:creator>
				<category><![CDATA[awk]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[grep]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://shatlovsky.ru/blog/2008/10/01/vim-tabs/</guid>
		<description><![CDATA[Открыть сразу несколько файлов в tab'ах в vim можно так: ~$ vim -p `find -type f -name '*.rb' -print0 &#124; xargs -0 file -i &#124; grep -v 'utf-8' &#124; awk '{print $1}' &#124; sed 's/://'` (пример от Харитона, открываем в vim все ruby-файлы в кодировке, отличной от utf-8) Здесь важен ключ -p: открыть файлы в [...]]]></description>
			<content:encoded><![CDATA[<p>Открыть сразу несколько файлов в tab'ах в vim можно так:</p>
<pre class="bash">~$ vim -p `find -type f -name '*.rb' -print0 | xargs -0 file -i | grep -v 'utf-8' | awk '{print $1}' | sed 's/://'`</pre>
<p>(пример от Харитона, открываем в vim все ruby-файлы в кодировке, отличной от utf-8)<br />
Здесь важен ключ -p: открыть файлы в табах.</p>
<p>Vim откроет столько буферов, сколько нашлось файлов, но не более <code>tabpagemax</code>, по умолчанию 10. Изменить количество табов можно в <code>~/.vimrc</code> так:</p>
<p><code>set tabpagemax=15</code></p>
<p>При превышении <code>tabpagemax</code> новые табы не создаются, но навигировать по файлам все равно можно командами <code>:next</code> и <code>:last</code>.</p>
<p>Переключаться между табами можно командами: <code>:tabnext</code>, <code>:tabprevious</code>, <code>:tablast</code>, <code>:tabfirst</code>. Можно замапить из на горячие клавиши. Можно пользоваться горячими клавишами &lt;C-PgUp&gt; and &lt;C-PgDown&gt;.</p>
<p>Ещё полезное:<br />
<code>:tabn[ew]</code> - открыть новый таб<br />
<code>:tabe[dit] [++opt] [+cmd] {file}</code> - открыть файл в новом табе (типа <code>:edit</code>)<br />
<code>:tabf[ind] [++opt] [+cmd] {file}</code> - найти файл в <code>path</code> и открыть в новом табе (типа <code>:find</code>)<br />
<code>CTRL-W gf</code> - редактировать файл с именем, находящимся под курсором, в новом табе<br />
<code>CTRL-W gF</code> - редактировать файл с именем, находящимся под курсором, в новом табе. Отмотать на строку которая указана после имени файла<br />
<code>:tabc[lose][!]</code> - закрыть таб<br />
<code>:tabo[nly][!]</code> - закрыть все табы кроме активного<br />
<code>:tabn[ext]</code> (<code>gt</code>, &lt;C-PageDown&gt;)  - переключиться на следующий таб<br />
<code>:tabp[revious]</code> (<code>:tabN[ext]</code>, <code>gT</code>) - на предыдущий таб<br />
<code>:tabr[ewind]</code> (<code>:tabfir[st]</code>)  - на первый таб<br />
<code>:tabl[ast]</code> - на последний<br />
<code>:tabs</code> - список табов<br />
<code>:tabm[ove] [N]</code> - переместить текущий таб на место сразу за N-ым<br />
<code>:tabd[o] {cmd}</code> - выполнить команду на каждом из табов (<code>:tabdo %s/foo/bar/g</code>)</p>
<p>Подробнее здесь - <code class="warn">:help tabpage</code></p>
<p>Еще интересная фишка. Если переместить курсор на имя файла и нажать <code>gf</code> (go-to-file), то откроется <em>альтернативный буфер</em> с содержимым указанного файла. Старый файл как-бы пропадет из поля зрения. Однако на него можно быстро переключиться командой <code>C-^</code>, так же и обратно. Так удобно редактировать 2 файла одновременно.</p>
<p>По поводу полезных маппингов:<br />
<a href="http://www.bygonesky.com/Programming/Settings/Vim/carlos.vim.html">http://www.bygonesky.com/Programming/Settings/Vim/carlos.vim.html</a>, смотреть начиная со 125-й строки.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.shatlovsky.ru/2008/10/01/vim-tabs/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>grep+awk: запросто вынимаем значение параметра из конфига</title>
		<link>http://www.shatlovsky.ru/2008/09/18/grepawk-zaprosto-vynimaem-znachenie-parametra-iz-konfiga/</link>
		<comments>http://www.shatlovsky.ru/2008/09/18/grepawk-zaprosto-vynimaem-znachenie-parametra-iz-konfiga/#comments</comments>
		<pubDate>Wed, 17 Sep 2008 20:30:29 +0000</pubDate>
		<dc:creator>Alex Shatlovsky</dc:creator>
				<category><![CDATA[awk]]></category>
		<category><![CDATA[grep]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tail]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://shatlovsky.ru/blog/2008/09/18/grepawk-zaprosto-vynimaem-znachenie-parametra-iz-konfiga/</guid>
		<description><![CDATA[Задача: передать в sh-скрипт значение параметра PidFile из конфига apache. Решение: CONF=&#34;/usr/local/apache/conf/httpd.conf&#34; PIDFILE=`grep -i ^&#91;&#91;:space:&#93;&#93;*pidfile $CONF &#124; tail -n 1 &#124; awk '{ print $2 }'` Где: grep -i ^&#91;&#91;:space:&#93;&#93;*pidfile $CONF - выбираем из конфига все строки, начинающиеся сPidFile tail -n 1 - берем последнюю из них awk '{ print $2 }' - выбираем из [...]]]></description>
			<content:encoded><![CDATA[<p>Задача: передать в sh-скрипт значение параметра PidFile из конфига apache.</p>
<p>Решение:</p>
<pre class="bash"><span style="color: #007800;">CONF=</span><span style="color: #ff0000;">&quot;/usr/local/apache/conf/httpd.conf&quot;</span>
<span style="color: #007800;">PIDFILE=</span>`<span style="color: #c20cb9; font-weight: bold;">grep</span> -i ^<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>:space:<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>*pidfile <span style="color: #007800;">$CONF</span> | <span style="color: #c20cb9; font-weight: bold;">tail</span> -n <span style="color: #000000;">1</span> | <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{ print $2 }'</span>`</pre>
<p>Где:</p>
<pre class="bash"><span style="color: #c20cb9; font-weight: bold;">grep</span> -i ^<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>:space:<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>*pidfile <span style="color: #007800;">$CONF</span></pre>
<p>- выбираем из конфига все строки, начинающиеся сPidFile</p>
<pre class="bash"><span style="color: #c20cb9; font-weight: bold;">tail</span> -n <span style="color: #000000;">1</span></pre>
<p>- берем последнюю из них</p>
<pre class="bash"><span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{ print $2 }'</span></pre>
<p>- выбираем из нее второе поле (значение)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.shatlovsky.ru/2008/09/18/grepawk-zaprosto-vynimaem-znachenie-parametra-iz-konfiga/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Переименовать все файлы в нижний регистр</title>
		<link>http://www.shatlovsky.ru/2008/09/07/pereimenovat-vse-fajly-v-tekushhej-direktorii-v-nizhnij-registr/</link>
		<comments>http://www.shatlovsky.ru/2008/09/07/pereimenovat-vse-fajly-v-tekushhej-direktorii-v-nizhnij-registr/#comments</comments>
		<pubDate>Sun, 07 Sep 2008 18:50:35 +0000</pubDate>
		<dc:creator>Alex Shatlovsky</dc:creator>
				<category><![CDATA[awk]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mv]]></category>
		<category><![CDATA[xargs]]></category>

		<guid isPermaLink="false">http://shatlovsky.nichost.ru/wps/?p=4</guid>
		<description><![CDATA[Переименовать все файлы в текущей и во всех вложенных директориях в нижний регистр: ~$ find ./ -type f &#124; awk '{ print $1 " " tolower($1) }' &#124; xargs -L 1 mv Харитон Мизгирь пишет: Чтобы обрабатывались пути с пробелами и проч. непечатностями надо использовать конструкцию типа: ~$ find -print0 &#124; xargs -0 Объяснение по [...]]]></description>
			<content:encoded><![CDATA[<p>Переименовать все файлы в текущей и во всех вложенных директориях в нижний регистр:</p>
<p><code class="em">~$ find ./ -type f | awk '{ print $1 " " tolower($1) }' | xargs -L 1 mv</code></p>
<p><strong>Харитон Мизгирь пишет</strong>: Чтобы обрабатывались пути с пробелами и проч. непечатностями надо использовать конструкцию типа:<br />
<code>~$ find <em>-print0</em> | xargs <em>-0</em></code></p>
<p>Объяснение по поводу параметра -print0 (find'а) и -0 (xargs'а)</p>
<p>В имени файла может попасться символ, который требует экранирования при обработке (single or double quotes, spaces or newlines). <code>print0</code> заставляет выводить список найденных файлов разделяя их через нуль-символ ('\0', в духе языка C, где он используется для декларации конца строки). <code>xargs</code> тоже должен быть готов к такому разделителю, для этого служит <code><em>-0</em></code>.</p>
<p><code>find</code> и <code>xargs</code> по разному себя ведет когда ищут из текущей директории или когда ищут из родительской (в родительской прекрасно обрабатывал директории с пробелами и любыми кавычками, которые находились в дочерней директории). newlines не обрабатывается нигде.</p>
<p>Провел такой эксперимент. Создал скрипт (в файле):</p>
<p><code>mkdir "Bad \<br />
bad \<br />
bad \<br />
dir"</code></p>
<p>– получил директорию с newlines.</p>
<p>Создал там файл README.txt и попытался его найти:</p>
<p><code>touch README.txt<br />
cd ..<br />
find . -name README.txt | xargs -I % ls %</code></p>
<p>Получил ошибку:</p>
<p><code>xargs: unmatched одинарная quote; by default quotes are special to xargs unless you use the -0 option</code><br />
(загадочное сообщение: "по умолчанию кавычки обрабатываются xargs, если только вы не используете параметр -0")</p>
<p>Та же команда в связке print0-0 работает нормально:</p>
<p><code>find . -name README.txt -print0 | xargs -0 -I % ls %</code></p>
<p>Ошибки, которые возникали в текущей директории (в родительской все было нормально):</p>
<p><code>ls: ./Временнаяnдиректория/README.txt: No such file or directory</code></p>
<p>То есть использование связки <code>print0 ... -0</code> желательно всегда. Можно прописать через <code>alias</code>'ы.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.shatlovsky.ru/2008/09/07/pereimenovat-vse-fajly-v-tekushhej-direktorii-v-nizhnij-registr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

