<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>meisw's blog</title>
		<link>http://meisw.wdlinux.cn//</link>
		<description>工作,学习,生活,这里将会有一些记录.     备用域名:http://meisw.wdlinux.cn</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>SaBlog-X Version 1.6 Build 20080806</generator>
		<lastBuildDate>Sat, 30 May 2026 01:05:45 +0000</lastBuildDate>
		<ttl>30</ttl>
		<item>
			<guid>http://meisw.wdlinux.cn//show-417-1.html</guid>
			<title>我的awk编程起步-寻找awk教程</title>
			<author>admin</author>
			<description><![CDATA[<div class="storyContent">
<p>这两天一直忙于手头上其它的和网络无关的工作，这些工作非常的机械化，所以让人很窒息，于是在网上搜了下awk这个奇怪的脚本语言。虽然自己的shell还没有真正意义上的开始，相信在5.1期间应该可以向前推进。</p>
<p>awk在处理文本数据有先天的优势，同时还支持正规的正则表达式，至于其它的优点就不说了。反正也只是用来消遣一下这窒息的工作，让心自由！</p>
<p><strong>awk教程</strong>(IBM提供):<a href="http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-1/index.html">http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-1/index.html</a> 第一部分<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-2/">http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-2/</a> 第二部分<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-3/">http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-3/</a> 第三部分<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.ibm.com/developerworks/cn/linux/l-cn-awkarrays/">http://www.ibm.com/developerworks/cn/linux/l-cn-awkarrays/</a>&nbsp; AWK 关联数组的一个应用<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.ibm.com/developerworks/cn/linux/l-cn-awkinwork/">http://www.ibm.com/developerworks/cn/linux/l-cn-awkinwork/</a>&nbsp; 利用 AWK 的数值计算功能提升工作效率<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.ibm.com/developerworks/cn/linux/l-cn-awkf/">http://www.ibm.com/developerworks/cn/linux/l-cn-awkf/</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Awk 中变量作用域的问题<br />
这是网上能找到最好的awk入门教程，做为像我等之辈希望还能找到更全面的实例来加以练习<br />
以以下是我写得第一个关于awk处理文本的例子:</p>
<pre class="discode"># awk -F&quot;:&quot; '{ print &quot;username:&quot; $1 &quot;\t&quot; &quot;passwd:&quot; $2 }' /etc/shadow</pre>
<p>看这代码的样式 ，这是明目张胆的抄袭！</p>
</div>]]></description>
			<link>http://meisw.wdlinux.cn//show-417-1.html</link>
			<category domain="http://meisw.wdlinux.cn//category-30-1.html">awk</category>
			<pubDate>2011-06-09 15:23</pubDate>
		</item>
		<item>
			<guid>http://meisw.wdlinux.cn//show-314-1.html</guid>
			<title>awk 逻辑与</title>
			<author>admin</author>
			<description><![CDATA[<p>awk '/mysql/&amp;&amp;/apache/</p>]]></description>
			<link>http://meisw.wdlinux.cn//show-314-1.html</link>
			<category domain="http://meisw.wdlinux.cn//category-30-1.html">awk</category>
			<pubDate>2010-12-04 17:48</pubDate>
		</item>
		<item>
			<guid>http://meisw.wdlinux.cn//show-313-1.html</guid>
			<title>详解著名的awk oneliner，第二部分：文本替换</title>
			<author>admin</author>
			<description><![CDATA[<h3 id="windowsdoscrlfunixlf">将Windows/dos格式的换行(CRLF)转成Unix格式(LF)</h3>
<pre><code>awk '{ sub(/\r$/,&quot;&quot;); print }'</code></pre>
<p>这条语句使用了<code>sub(regex,repl,[string])</code>函数。此函数将匹配regex的string替换成repl，如果没有提供string参数，则$0将会被默认使用。$0的含义在上一篇已经介绍过，代表整行。</p>
<p>这句话其实是将<code>\r</code>删除，然后print语句在行后自动添加一个ORS，也就是默认的<code>\n</code>。</p>
<h3 id="unixlfwindowsdoscrlf">将Unix格式的换行(LF)换成Windows/dos格式(CRLF)</h3>
<pre><code>awk '{ sub(/$/,&quot;\r&quot;); print }'</code></pre>
<p>这句话同样使用了sub函数，它将长度为0的行结束符$替换成<code>\r</code>，也就是CR。然后print语句在后面添加一个ORS，使每行最后以CRLF结束。</p>
<h3 id="windowsunixwindowsdos">在Windows下，将Unix格式的换行换成Windows/dos格式的换行符</h3>
<pre><code>awk 1</code></pre>
<p>这条语句不是在所有情况下都可以用，要视使用的awk版本是不是能识别Unix格式的换行而定。如果能，那么它会读出每个句子，然后输出并用CRLF结束。1其实就是<code>{ print }</code>的简写形式。</p>
<h3 id="id28">删除行首的空格和制表符</h3>
<pre><code>awk '{ sub(/^[ \t]+/,&quot;&quot;); print }'</code></pre>
<p>和前面的例子相似，sub函数将<code>[ \t]+</code>用空字符串替换，达到删除行首空格的目的。</p>
<h3 id="id29">删除行首和行末的空格</h3>
<pre><code>awk '{ gsub(/^[ \t]+|[ \t]+$/,&quot;&quot;); print }'</code></pre>
<p>这条语句使用了一个新函数gsub，它和sub的区别在于它会替换句子里面的所有匹配。如果仅仅是要删除字段间的空格，你可以这样</p>
<pre><code>awk '{ $1=$1; print }'</code></pre>
<p>这是条很取巧的语句，看起来是什么也没作。awk会在你给字段重新赋值的时候对$0重新进行架构，用OFS也就是单个空格分隔所有字段，这样以来所有的多余的空格就消失了。</p>
<h3 id="5">在每行首加5个空格</h3>
<pre><code>awk '{ sub(/^/,&quot;     &quot;); print }'</code></pre>
<p>同上，sub将行首符替换为5个空格，达到了在行首添加空格的目的。</p>
<h3 id="79">让内容在79个字符宽的页面上右对齐</h3>
<pre><code>awk '{ printf &quot;%79s\n&quot;, $0 }'</code></pre>
<p>同上一篇，又使用了printf函数。</p>
<h3 id="79">让内容在79个字符宽的页面上居中对齐</h3>
<pre><code>awk '{ l=length(); s=int((79-l)/2); printf &quot;%&quot;(s+l)&quot;s\n&quot;, $0 }'</code></pre>
<p>第一句用length函数计算当前行内容的长度，第二句计算行首应该添加多少空格，第三句让内容在s+l宽度靠右对齐。</p>
<h3 id="foobar">把foo替换成bar</h3>
<pre><code>awk '{ sub(/foo/,&quot;bar&quot;); print }'</code></pre>
<p>同上，sub函数将每行中第一个foo换成了bar。但是，如果想要把每行中所有的foo都替换成bar，你需要</p>
<pre><code>awk '{ gsub(/foo/,&quot;bar&quot;); print }'</code></pre>
<p>另外一种方法就是使用gensub函数</p>
<pre><code>awk '{ $0=gensub(/foo/,&quot;bar&quot;,4); print }'</code></pre>
<p>这条语句的不同在于它只是将每行第四次出现的foo替换成bar，它的原型是<code>gensub(regex,s,h[,t])</code>，它将字符串t中第h个regex替换成s，如果没有提供t参数，那么默认t就是$0。gensub不是一个标准函数，你只有在GNU Awk或者netBSD带的awk里面才能用到它。</p>
<h3 id="bazfoobar">在含有baz的行里面，把foo替换成bar</h3>
<pre><code>awk '/baz/ { sub(/foo/,&quot;bar&quot;) }; {print}'</code></pre>
<p>(真的没什么好说的)</p>
<h3 id="bazfoobar">在不含baz的行里，把foo替换成bar</h3>
<pre><code>awk '!/baz/ { gsub(/foo/, &quot;bar&quot;) }; { print }'</code></pre>
<p>跟上一句的差别是用<code>!</code>让搜到baz的返回为假。</p>
<h3 id="scarletrubypucered">把scarlet或者ruby或者puce替换成red</h3>
<pre><code>awk '{ gsub(/scarlet|ruby|puce/,&quot;red&quot;); print }'</code></pre>
<p>(再懒一次)</p>
<h3 id="tac">让文本首位倒置，模仿tac</h3>
<pre><code>awk '{ a[i++] = $0} END { for (j=i-1; j&gt;=0;) print a[j--] }'</code></pre>
<p>首先，把每一行的内容放到数组a里面。在最后，让变量j从a的最大编号变到0，从后望前逐行输出a里面的内容。</p>
<h3 id="id30">把以\结束的行同下一行相接</h3>
<pre><code>awk '/\\$/ { sub(/\\$/,&quot;&quot;); getline t; print $0 t; next }; 1'</code></pre>
<p>首先查找以\结束的行，并删除\。然后getline函数获取下一行的内容，输出当前行（去掉了\）和下一行的相接后的内容。并用next跳过后面的<code>1</code>避免重复输出。如果当前行行末没有\，会直接执行<code>1</code>输出。</p>
<h3 id="id31">将所有用户名排序并输出</h3>
<pre><code>awk -F &quot;:&quot; '{ print $1 | &quot;sort&quot; }' /etc/passwd</code></pre>
<p>这里首先用<code>-F</code>指定了分隔符为冒号，然后用<code>|</code>指定输出的内容逐行pipe给外部程序<code>sort</code>。(这写法真是奇怪)。</p>
<h3 id="id32">将前两个字段倒序输出</h3>
<pre><code>awk '{ print $2, $1 }' file</code></pre>
<p>没什么好说的。</p>
<h3 id="id33">将每行里面的前两个字段交换位置</h3>
<pre><code>awk '{ temp = $1; $1 = $2; $2 = temp; print }'</code></pre>
<p>因为要输出整行，只好重新给$1和$2赋值，用个临时变量做中转。</p>
<h3 id="id34">删除每行的第二个字段</h3>
<pre><code>awk '{ $2 = &quot;&quot;; print }'</code></pre>
<p>就是把第二个字段赋值为空字符串</p>
<h3 id="id35">把每行的所有字段倒序输出</h3>
<pre><code>awk '{ for (i=NF; i&gt;0; i--) printf(&quot;%s &quot;, $i); printf (&quot;\n&quot;) }'</code></pre>
<p>没什么好说的</p>
<h3 id="id36">删除连续的重复行</h3>
<pre><code>awk 'a != $0; { a = $0 }'</code></pre>
<p>前一句省略了action，选择输出整行内容与a不一样的；后一句省略了pattern，把当前行的内容赋值给a。a在这个例子中的左右是记录上一行的内容。</p>
<h3 id="id37">删除非连续的重复行</h3>
<pre><code>awk '!a[$0]++'</code></pre>
<p>这一句真是很有ee的风范！把当前行的内容作为数组a的索引，如果a里面已经有了$0的记录，即遇到了重复，pattern的值为0，不输出。</p>
<h3 id="5">把每5行用逗号相连</h3>
<pre><code>awk 'ORS=NR%5?&quot;,&quot;:&quot;\n&quot;'</code></pre>
<p>这里在每行输出前，对ORS重新进行定义，如果行号能被5整除则为<code>\n</code>，否则为逗号。（也很天书的一句）</p>]]></description>
			<link>http://meisw.wdlinux.cn//show-313-1.html</link>
			<category domain="http://meisw.wdlinux.cn//category-30-1.html">awk</category>
			<pubDate>2010-12-04 17:18</pubDate>
		</item>
		<item>
			<guid>http://meisw.wdlinux.cn//show-312-1.html</guid>
			<title>awk中 NR 和 FNR的区别</title>
			<author>admin</author>
			<description><![CDATA[<pre id="best-answer-content">比如现在AWK处理到第五行。第一行没有进行操作，2,3,4,5行进行了操作，那么NR=5,FNR=4

 NR==FNR 表示从起始行到当前行，awk都进行了操作，比如修改，添加等等 

简单来说，NR就是当前读取多少行，FNR就是当前修改了多少行，FNR&lt;=NR</pre>]]></description>
			<link>http://meisw.wdlinux.cn//show-312-1.html</link>
			<category domain="http://meisw.wdlinux.cn//category-30-1.html">awk</category>
			<pubDate>2010-12-04 17:09</pubDate>
		</item>
		<item>
			<guid>http://meisw.wdlinux.cn//show-311-1.html</guid>
			<title>转行为列，特定行为记录分割符</title>
			<author>admin</author>
			<description><![CDATA[<div>file</div>
<div>&nbsp;</div>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">#<br />
            1<br />
            2<br />
            3<br />
            #<br />
            4<br />
            5<br />
            #<br />
            6<br />
            7<br />
            8<br />
            9<br />
            #</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>输出为</p>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000">1<span style="color: #0000cc">,</span>2<span style="color: #0000cc">,</span>3<br />
            4<span style="color: #0000cc">,</span>5<br />
            6<span style="color: #0000cc">,</span>7<span style="color: #0000cc">,</span>8<span style="color: #0000cc">,</span>9</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="#999999" cellpadding="0" width="95%" bgcolor="#f1f1f1">
    <tbody>
        <tr>
            <td>
            <p style="line-height: 150%; margin: 5px"><code><span style="color: #000000"><span style="color: #0000cc">[</span>root@Mylinux tmp<span style="color: #0000cc">]</span><span style="color: #0000cc">#</span> awk <span style="color: #ff00ff">'BEGIN{RS=&quot;#&quot;;OFS=&quot;,&quot;}NF=NF'</span> file<br />
            1<span style="color: #0000cc">,</span>2<span style="color: #0000cc">,</span>3<br />
            4<span style="color: #0000cc">,</span>5<br />
            6<span style="color: #0000cc">,</span>7<span style="color: #0000cc">,</span>8<span style="color: #0000cc">,</span>9</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<p>
<table style="border-collapse: collapse; word-wrap: break-word; color: #02368d" border="0" cellspacing="0" cellpadding="0" width="500">
    <tbody>
        <tr height="30">
            <td valign="top" width="20">&nbsp;</td>
            <td valign="top" width="480">
            <pre style="line-height: 150%; margin: 0px" wrap="break-word">不过严谨的用法还是用<br />
awk&nbsp;'BEGIN{RS=&quot;#&quot;;OFS=&quot;,&quot;}{NF=NF;print}'&nbsp;file<br />
或awk&nbsp;'BEGIN{RS=&quot;#&quot;;OFS=&quot;,&quot;}{$1=$1;print}'&nbsp;file<br />
<br />
因为如果file中有空行或$1为空的行<br />
awk&nbsp;'BEGIN{RS=&quot;#&quot;;OFS=&quot;,&quot;}NF=NF'&nbsp;file<br />
awk&nbsp;'BEGIN{RS=&quot;#&quot;;OFS=&quot;,&quot;}$1=$1'&nbsp;file<br />
的用法会丢失这些行</pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<p><a href="http://blog.chinaunix.net/u3/91453/showart_1818733.html">http://blog.chinaunix.net/u3/91453/showart_1818733.html</a></p>]]></description>
			<link>http://meisw.wdlinux.cn//show-311-1.html</link>
			<category domain="http://meisw.wdlinux.cn//category-30-1.html">awk</category>
			<pubDate>2010-12-04 16:57</pubDate>
		</item>
		<item>
			<guid>http://meisw.wdlinux.cn//show-310-1.html</guid>
			<title>awk的环境变量</title>
			<author>admin</author>
			<description><![CDATA[<div class="table"><a name="id2810296"></a>
<p class="title"><strong>Table&nbsp;1.&nbsp;awk的环境变量</strong></p>
<table border="1" summary="awk的环境变量">
    <colgroup><col></col><col></col></colgroup>
    <thead>
        <tr>
            <th>变量</th>
            <th>描述</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>$n</td>
            <td>当前记录的第n个字段，字段间由FS分隔。</td>
        </tr>
        <tr>
            <td>$0</td>
            <td>完整的输入记录。</td>
        </tr>
        <tr>
            <td>ARGC</td>
            <td>命令行参数的数目。</td>
        </tr>
        <tr>
            <td>ARGIND</td>
            <td>命令行中当前文件的位置(从0开始算)。</td>
        </tr>
        <tr>
            <td>ARGV</td>
            <td>包含命令行参数的数组。</td>
        </tr>
        <tr>
            <td>CONVFMT</td>
            <td>数字转换格式(默认值为%.6g)</td>
        </tr>
        <tr>
            <td>ENVIRON</td>
            <td>环境变量关联数组。</td>
        </tr>
        <tr>
            <td>ERRNO</td>
            <td>最后一个系统错误的描述。</td>
        </tr>
        <tr>
            <td>FIELDWIDTHS</td>
            <td>字段宽度列表(用空格键分隔)。</td>
        </tr>
        <tr>
            <td>FILENAME</td>
            <td>当前文件名。</td>
        </tr>
        <tr>
            <td>FNR</td>
            <td>同NR，但相对于当前文件。</td>
        </tr>
        <tr>
            <td>FS</td>
            <td>字段分隔符(默认是任何空格)。</td>
        </tr>
        <tr>
            <td>IGNORECASE</td>
            <td>如果为真，则进行忽略大小写的匹配。</td>
        </tr>
        <tr>
            <td>NF</td>
            <td>当前记录中的字段数。</td>
        </tr>
        <tr>
            <td>NR</td>
            <td>当前记录数。</td>
        </tr>
        <tr>
            <td>OFMT</td>
            <td>数字的输出格式(默认值是%.6g)。</td>
        </tr>
        <tr>
            <td>OFS</td>
            <td>输出字段分隔符(默认值是一个空格)。</td>
        </tr>
        <tr>
            <td>ORS</td>
            <td>输出记录分隔符(默认值是一个换行符)。</td>
        </tr>
        <tr>
            <td>RLENGTH</td>
            <td>由match函数所匹配的字符串的长度。</td>
        </tr>
        <tr>
            <td>RS</td>
            <td>记录分隔符(默认是一个换行符)。</td>
        </tr>
        <tr>
            <td>RSTART</td>
            <td>由match函数所匹配的字符串的第一个位置。</td>
        </tr>
        <tr>
            <td>SUBSEP</td>
            <td>数组下标分隔符(默认值是\034)。</td>
        </tr>
    </tbody>
</table>
</div>
<p>&nbsp;</p>
<p><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm">http://man.lupaworld.com/content/manage/ringkee/awk.htm</a></p>]]></description>
			<link>http://meisw.wdlinux.cn//show-310-1.html</link>
			<category domain="http://meisw.wdlinux.cn//category-30-1.html">awk</category>
			<pubDate>2010-12-04 16:56</pubDate>
		</item>
		<item>
			<guid>http://meisw.wdlinux.cn//show-309-1.html</guid>
			<title>awk 列变行实例</title>
			<author>admin</author>
			<description><![CDATA[<p>[root@asmboy ~]# more tes<br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sldj<br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sldfjf<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lsdf<br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sdsl<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ls<br />
[root@asmboy ~]# awk '$1==1{if(i++)printf &quot;,&quot;$2;else printf $2}END{print &quot;&quot;}' tes<br />
sldj,sldfjf,sdsl<br />
[root@asmboy ~]# awk '$1==2{if(i++)printf &quot;,&quot;$2;else printf $2}END{print &quot;&quot;}' tes<br />
lsdf,ls</p>]]></description>
			<link>http://meisw.wdlinux.cn//show-309-1.html</link>
			<category domain="http://meisw.wdlinux.cn//category-30-1.html">awk</category>
			<pubDate>2010-12-04 16:53</pubDate>
		</item>
	</channel>
</rss>
