<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[忆风居]]></title> 
<link>http://yfyfj.cn/index.php</link> 
<description><![CDATA[忆风的地盘，一些日常的记忆，技术文摘，以及收集的一些文章。]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[忆风居]]></copyright>
<item>
<link>http://yfyfj.cn/post/mrtg_monitor_cpu_memory_task.php</link>
<title><![CDATA[Mrtg系统状态监控[CPU 内存 网卡流量 系统进程 硬盘空间 TCP连接数]]></title> 
<author>yfyfj &lt;admin@yourname.com&gt;</author>
<category><![CDATA[Linux 平台]]></category>
<pubDate>Tue, 20 Jul 2010 03:17:33 +0000</pubDate> 
<guid>http://yfyfj.cn/post/mrtg_monitor_cpu_memory_task.php</guid> 
<description>
<![CDATA[ 
	----------------------------<br /> 1) 安装所需rpm包<br /> ----------------------------<br /> net-snmp-perl-5.1.2-11.EL4.6.x86_64.rpm<br /> net-snmp-libs-5.1.2-11.EL4.6.x86_64.rpm<br /> net-snmp-utils-5.1.2-11.EL4.6.x86_64.rpm<br /> net-snmp-devel-5.1.2-11.EL4.6.x86_64.rpm<br /> &nbsp; &nbsp;!!需要预先安装以下rpm包<br /> &nbsp; &nbsp;beecrypt-devel-3.1.0-6.x86_64.rpm<br /> &nbsp; &nbsp;elfutils-devel-0.97-5.x86_64.rpm(在第5张安装光盘上)<br /> net-snmp-5.1.2-11.EL4.6.x86_64.rpm<br /> net-snmp-utils-5.1.2-11.EL4.6.x86_64.rpm<br /> 安装mrtg-2.10.15-1.x86_64.rpm<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /> ----------------------------<br /> 2) 修改/etc/snmp/snmpd.conf<br /> ----------------------------<br /> 找到这行：<br /> # Make at least&nbsp;&nbsp;snmpwalk -v 1 localhost -c public system fast again<br /> #&nbsp; &nbsp;&nbsp; &nbsp; name&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;incl/excl&nbsp; &nbsp;&nbsp;&nbsp;subtree&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;mask(optional)<br /> view&nbsp; &nbsp; systemview&nbsp; &nbsp; included&nbsp; &nbsp;.1.3.6.1.2.1.1<br /> view&nbsp; &nbsp; systemview&nbsp; &nbsp; included&nbsp; &nbsp;.1.3.6.1.2.1.25.1.1<br /> 在view几行的下面，加上这段文字：<br /> # For Mrtg Add start ####################################<br /> view&nbsp; &nbsp; all&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;included&nbsp; &nbsp;.1.3.6<br /> # For Mrtg Add end&nbsp; &nbsp;####################################<br /> 找到这行：<br /> ####<br /> # Finally, grant the group read-only access to the systemview view.<br /> #&nbsp; &nbsp;&nbsp; &nbsp; group&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; context sec.model sec.level prefix read&nbsp;&nbsp;&nbsp;&nbsp;write&nbsp;&nbsp;notif<br /> access&nbsp;&nbsp;notConfigGroup &quot;&quot;&nbsp; &nbsp;&nbsp; &nbsp;any&nbsp; &nbsp;&nbsp; &nbsp; noauth&nbsp; &nbsp; exact&nbsp;&nbsp;mib2&nbsp; &nbsp;none&nbsp;&nbsp;&nbsp;&nbsp;none<br /> 把 access&nbsp;&nbsp;notConfigGroup 里的mib2(也可能是systemview) 更改为all<br /> 如果需要监控硬盘容量使用状况，还需要进行以下操作：<br /> 用 df -a 看到你要监控的硬盘分卷方式以及容量大小(-am:以M为单位; -ak:以K为单位 -ag:以G为单位)<br /> 比如：<br /> #df -am<br /> Filesystem&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;容量&nbsp;&nbsp;已用 可用 已用% 挂载点<br /> /dev/sda2&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;9845&nbsp; &nbsp;&nbsp; &nbsp;5695&nbsp; &nbsp;&nbsp; &nbsp;3650&nbsp;&nbsp;61% /<br /> /dev/sda6&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 45168&nbsp; &nbsp;&nbsp;&nbsp;24761&nbsp; &nbsp;&nbsp;&nbsp;18113&nbsp;&nbsp;58% /Datas<br /> 然后修改/etc/snmp/snmpd.conf，在刚才修改的view行最下面加入：<br /> disk / 9845<br /> disk /Datas 45168<br /> 然后重启snmp服务<br /> # service snmpd restart<br /> ----------------------------<br /> 3) 修改mrtg配置文件 mrtg.cfg<br /> ----------------------------<br /> 使用Redhat AS4u2 自带的 安装 mrtg-2.10.15-1.x86_64.rpm<br /> 安装以后的配置文件是/etc/mrtg/mrtg.cfg<br /> 我们预设要监控的服务器以下参数：<br /> 连接公网网卡的流量；<br /> 主机连续运行时间；<br /> 系统负载；<br /> CPU负载；<br /> 内存使用量；<br /> 系统进程数；<br /> 硬盘空间；<br /> 打开的TCP连接数。<br /> 我的mrtg.cfg配置如下：<br /> # Camor's Minimal mrtg.cfg<br /> #--------------------<br /> EnableIPv6: no<br /> WorkDir: /var/www/mrtg<br /> Language: gb2312<br /> HtmlDir: /var/www/mrtg<br /> ImageDir: /var/www/mrtg<br /> LogDir: /var/log/mrtg<br /> ThreshDir: /var/lib/mrtg<br /> LoadMIBs:/usr/share/snmp/mibs/UCD-SNMP-MIB.txt,/usr/share/snmp/mibs/HOST-RESOURCES-MIB.txt,/usr/share/snmp/mibs/TCP-MIB.txt<br /> #================================================================================<br /> #监控eth1网卡(连接公网的)<br /> #================================================================================<br /> Target[eth1_lan]: /192.168.1.68:public@localhost:<br /> Options[eth1_lan]: growright<br /> Directory[eth1_lan]: eth1<br /> MaxBytes[eth1_lan]: 100000000<br /> Kmg[eth1_lan]: ,k,M,G,T,P<br /> YLegend[eth1_lan]: Bytes per Second<br /> ShortLegend[eth1_lan]: B/s<br /> Legend1[eth1_lan]: 每秒流入量 (单位 Bytes)<br /> Legend2[eth1_lan]: 每秒流出量 (单位 Bytes)<br /> LegendI[eth1_lan]: 流入:<br /> LegendO[eth1_lan]: 流出:<br /> Title[eth1_lan]: eth1网络流量[流入+流出]<br /> PageTop[eth1_lan]: eth1网络流量[流入+流出]<br />&nbsp;&nbsp;<br /> &nbsp;&nbsp;系统 :System02<br /> &nbsp;&nbsp;描述 :LAN网络接口eth1的网络流量(Bytes/s)<br /> &nbsp;&nbsp;位置 : 办公服务器68<br /> &nbsp;&nbsp;最大值:100 MBytes/s<br /> &nbsp;&nbsp;管理员:user@123.com<br /> &nbsp;&nbsp;说明 :eth1 ip=192.168.1.68<br />&nbsp;&nbsp;<br /> #================================================================================<br /> #监控主机连续运行时间[运行天数]<br /> #================================================================================<br /> Target[upday]: `/etc/mrtg/bin/mrtg-updays.pl`<br /> Options[upday]: gauge,nopercent,growright<br /> Directory[upday]: upday<br /> MaxBytes[upday]: 1000<br /> YLegend[upday]: Up Days<br /> ShortLegend[upday]: 天<br /> Legend1[upday]: 主机连续运行时间(天)<br /> Legend2[upday]:<br /> LegendI[upday]: 运行时间:<br /> LegendO[upday]:<br /> Title[upday]: 主机连续运行时间[运行天数]<br /> PageTop[upday]: 主机连续运行时间[运行天数]<br />&nbsp;&nbsp;<br /> &nbsp;&nbsp;系统:system02<br /> &nbsp;&nbsp;描述:主机连续运行的时间(天)<br /> &nbsp;&nbsp;位置:办公服务器68<br /> &nbsp;&nbsp;最大值:1000天<br /> &nbsp;&nbsp;管理员:user@123.com<br />&nbsp;&nbsp;<br /> #================================================================================<br /> #监控系统负载[1分钟+15分钟]<br /> #================================================================================<br /> Target[systemload]:&nbsp;&nbsp;.1.3.6.1.4.1.2021.10.1.5.1&amp;.1.3.6.1.4.1.2021.10.1.5.3:public@localhost:<br /> Options[systemload]: gauge,nopercent,growright<br /> Directory[systemload]: load<br /> MaxBytes[systemload]: 3000<br /> YLegend[systemload]: System Load<br /> ShortLegend[systemload]:<br /> Legend1[systemload]: 最近1分钟系统负载(x100)<br /> Legend2[systemload]: 最近15分钟系统负载(x100)<br /> LegendI[systemload]: 1分钟负载:<br /> LegendO[systemload]: 15分钟负载:<br /> Title[systemload]: 系统负载(x100)[1分钟+15分钟]<br /> PageTop[systemload]: 系统负载(x100)[1分钟+15分钟]<br />&nbsp;&nbsp;<br /> &nbsp;&nbsp;系统:system02<br /> &nbsp;&nbsp;描述:系统负载(x100)[1分钟+15分钟]<br /> &nbsp;&nbsp;位置:办公服务器68<br /> &nbsp;&nbsp;最大值:30(x100)<br /> &nbsp;&nbsp;管理员:user@123.com<br />&nbsp;&nbsp;<br /> #================================================================================<br /> #监控CPU负载[用户+闲置]<br /> #================================================================================<br /> Target[cpuload]:&nbsp;&nbsp;.1.3.6.1.4.1.2021.11.50.0&amp;1.3.6.1.4.1.2021.11.53.0:public@localhost:<br /> Options[cpuload]: nopercent,growright<br /> Directory[cpuload]: cpu<br /> MaxBytes[cpuload]: 100<br /> Unscaled[cpuload]: dwym<br /> YLegend[cpuload]: CPU Utilization<br /> ShortLegend[cpuload]: %;<br /> Legend1[cpuload]: CPU用户负载(%)<br /> Legend2[cpuload]: CPU闲置(%)<br /> LegendI[cpuload]: 用户:<br /> LegendO[cpuload]: 闲置:<br /> Title[cpuload]: CPU负载[用户+闲置]<br /> PageTop[cpuload]: CPU负载[用户+闲置]<br />&nbsp;&nbsp;<br /> &nbsp;&nbsp;系统:system02<br /> &nbsp;&nbsp;描述:CPU负载[用户+闲置]<br /> &nbsp;&nbsp;位置:办公服务器68<br /> &nbsp;&nbsp;最大值:100<br /> &nbsp;&nbsp;管理员:user@123.com<br />&nbsp;&nbsp;<br /> #================================================================================<br /> #监控内存使用量[Mem+Swap]<br /> #================================================================================<br /> Target[memory]:&nbsp;&nbsp;.1.3.6.1.2.1.25.2.3.1.6.2&amp;.1.3.6.1.2.1.25.2.3.1.6.3:public@localhost:<br /> Options[memory]: gauge,growright<br /> Directory[memory]: mem<br /> MaxBytes1[memory]: 4045336<br /> MaxBytes2[memory]: 2097152<br /> Kmg[memory]: k,M,G,T,P<br /> Kilo[memory]: 1024<br /> Unscaled[memory]: dwym<br /> YLegend[memory]: Bytes<br /> ShortLegend[memory]: B<br /> Legend1[memory]: 已用Mem (Bytes)<br /> Legend2[memory]: 已用Swap(Bytes)<br /> LegendI[memory]: 已用Mem :<br /> LegendO[memory]: 已用Swap:<br /> Title[memory]: 内存使用量[Mem+Swap]<br /> PageTop[memory]: 内存使用量[Mem+Swap]<br />&nbsp;&nbsp;<br /> &nbsp;&nbsp;系统:system02<br /> &nbsp;&nbsp;描述:Memory和Swap的使用量(Bytes)<br /> &nbsp;&nbsp;位置:办公服务器68<br /> &nbsp;&nbsp;最大值:Mem=4096M,Swap=2048M<br /> &nbsp;&nbsp;管理员:user@123.com<br />&nbsp;&nbsp;<br /> #================================================================================<br /> #监控系统进程数[进程数]<br /> #================================================================================<br /> Target[process]:&nbsp;&nbsp;.1.3.6.1.2.1.25.1.6.0&amp;.1.3.6.1.2.1.25.1.6.0:public@localhost:<br /> Options[process]: gauge,nopercent,growright<br /> Directory[process]: process<br /> MaxBytes[process]: 1000<br /> YLegend[process]: Processes<br /> ShortLegend[process]: 个<br /> Legend1[process]: 系统进程数(个)<br /> Legend2[process]:<br /> LegendI[process]: 进程数:<br /> LegendO[process]:<br /> Title[process]: 系统进程数[进程数]<br /> PageTop[process]: 系统进程数[进程数]<br />&nbsp;&nbsp;<br /> &nbsp;&nbsp;系统:system02<br /> &nbsp;&nbsp;描述:系统进程数(个)<br /> &nbsp;&nbsp;位置:办公服务器68<br /> &nbsp;&nbsp;最大值:1000个<br /> &nbsp;&nbsp;管理员:user@123.com<br />&nbsp;&nbsp;<br /> #==================================================================================<br /> #监控硬盘空间[系统盘+数据盘]&nbsp;&nbsp;！！参照前面的2) 这里需要与修改后snmpd.conf 的硬盘参数一致<br /> #==================================================================================<br /> Target[disk]:&nbsp;&nbsp;.1.3.6.1.4.1.2021.9.1.8.1&amp;.1.3.6.1.4.1.2021.9.1.8.2:public@localhost:<br /> Options[disk]: gauge,growright<br /> Directory[disk]: disk<br /> MaxBytes1[disk]: 10080520<br /> MaxBytes2[disk]: 46251780<br /> Kmg[disk]: k,M,G,T,P<br /> Kilo[disk]: 1024<br /> Unscaled[disk]: dwym<br /> YLegend[disk]: Bytes<br /> ShortLegend[disk]: B<br /> Legend1[disk]: 系统盘已用空间<br /> Legend2[disk]: 数据盘已用空间<br /> LegendI[disk]: 系统已用:<br /> LegendO[disk]: 数据已用:<br /> Title[disk]: 硬盘空间[系统盘+数据盘]<br /> PageTop[disk]: 硬盘空间[系统盘+数据盘]<br />&nbsp;&nbsp;<br /> &nbsp;&nbsp;系统:system02<br /> &nbsp;&nbsp;描述:系统盘=/(/dev/sda2); 数据盘=/Datas(/dev/sda6)<br /> &nbsp;&nbsp;位置:办公服务器68<br /> &nbsp;&nbsp;最大值:系统盘=10.0GB; 数据盘=45.0GB<br /> &nbsp;&nbsp;管理员:user@123.com<br />&nbsp;&nbsp;<br /> #================================================================================<br /> #监控打开的TCP连接数[TCP连接数]<br /> #================================================================================<br /> Target[tcpopen]:&nbsp;&nbsp;.1.3.6.1.2.1.6.9.0&amp;.1.3.6.1.2.1.6.9.0:public@localhost:<br /> Options[tcpopen]: gauge,nopercent,growright<br /> Directory[tcpopen]: tcpopen<br /> MaxBytes[tcpopen]: 1000<br /> YLegend[tcpopen]: Tcp Connections<br /> ShortLegend[tcpopen]: 个<br /> Legend1[tcpopen]: 打开的TCP连接数(个)<br /> Legend2[tcpopen]:<br /> LegendI[tcpopen]: TCP连接数:<br /> LegendO[tcpopen]:<br /> Title[tcpopen]: TCP连接数[TCP连接数]<br /> PageTop[tcpopen]: TCP连接数[TCP连接数]<br />&nbsp;&nbsp;<br /> &nbsp;&nbsp;系统:system02<br /> &nbsp;&nbsp;描述:打开的TCP连接数(个)<br /> &nbsp;&nbsp;位置:办公服务器68<br /> &nbsp;&nbsp;最大值:1000个<br /> &nbsp;&nbsp;管理员:user@123.com<br />&nbsp;&nbsp;<br /> ###################### All Set Over #########################<br /> 注意<br /> 在上面监控主机连续运行时间的配置中，有提到要使用/etc/mrtg/bin/mrtg-updays.pl这个文件。需要手动创建，内容如下：<br /> #!/usr/bin/perl<br /> $machine = `/bin/hostname`;<br /> $uptime1 = `/usr/bin/uptime`;<br /> $uptime2 = $uptime1;<br /> $uptime1 =~ /up (.*?) day/;<br /> $upday = int($1);<br /> $uptime2 =~ /up (.*?) load/;<br /> $uptime = $1;<br /> print &quot;$upday&#92;n&quot;;<br /> print &quot;$upday&#92;n&quot;;<br /> print &quot;$uptime&#92;n&quot;;<br /> print $machine.&quot;&#92;n&quot;;<br /> 保存以后修改权限为可执行：<br /> #chmod +x /etc/mrtg/bin/mrtg-updays.pl<br /> 注意<br /> 关于硬盘参数，一定要注意<br /> snmp.conf与mrtg.cfg中的格式、参数一定要一致，并且完全跟df -a*的命令结果相符。否则会得到输入错误的提示信息。<br />&nbsp;&nbsp;<br /> ----------------------------<br /> 4) 生成工作目录及相关文件<br /> ----------------------------<br /> mrtg /etc/mrtg/mrtg.cfg<br />&nbsp;&nbsp;<br /> ----------------------------<br /> 5) 生成监控的页面文件<br /> ----------------------------<br /> indexmaker --output /var/www/mrtg/index.html --title=&quot;System state&nbsp;&nbsp;Monitor&quot; /etc/mrtg/mrtg.cfg<br/>Tags - <a href="http://yfyfj.cn/go.php/tags/mrtg/" rel="tag">mrtg</a> , <a href="http://yfyfj.cn/go.php/tags/cpu/" rel="tag">cpu</a>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/post/awk_command.php</link>
<title><![CDATA[Awk学习笔记]]></title> 
<author>忆风 &lt;web@web.com&gt;</author>
<category><![CDATA[Linux 平台]]></category>
<pubDate>Tue, 06 Jul 2010 04:01:39 +0000</pubDate> 
<guid>http://yfyfj.cn/post/awk_command.php</guid> 
<description>
<![CDATA[ 
	<div class="article"><div class="titlepage"><div><div><h1 class="title"><a name="id2875166"></a>Awk学习笔记</h1></div><div><div class="author"><h3 class="author"><span class="firstname">整理：Jims of <a href="http://www.ringkee.com/" target="_top">肥肥世家</a></span></h3><div class="affiliation"><div class="address"><p>&lt;<a href="mailto:jims.yang@gmail.com">jims.yang@gmail.com</a>&gt;</p></div></div></div></div><div><p class="copyright">Copyright &copy; 2004 本文遵从GPL协议，欢迎转载、修改、散布。</p></div><div><p class="pubdate">第一次发布时间:2004年8月6日</p></div></div><hr /></div><div class="toc"><p><strong>Table of Contents</strong></p><dl><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2874788">1.&nbsp;&nbsp;awk简介</a></span></dt><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2875182">2.&nbsp;&nbsp;awk命令格式和选项</a></span></dt><dd><dl><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2875104">2.1.&nbsp;&nbsp;awk的语法有两种形式</a></span></dt><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2811790">2.2.&nbsp;&nbsp;命令选项</a></span></dt></dl></dd><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2810094">3.&nbsp;&nbsp;模式和操作</a></span></dt><dd><dl><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2810128">3.1.&nbsp;&nbsp;模式</a></span></dt><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2810236">3.2.&nbsp;&nbsp;操作</a></span></dt></dl></dd><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2810288">4.&nbsp;&nbsp;awk的环境变量</a></span></dt><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2861410">5.&nbsp;&nbsp;awk运算符</a></span></dt><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2861636">6.&nbsp;&nbsp;记录和域</a></span></dt><dd><dl><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2861644">6.1.&nbsp;&nbsp;记录</a></span></dt><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2861680">6.2.&nbsp;&nbsp;域</a></span></dt><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2861697">6.3.&nbsp;&nbsp;域分隔符</a></span></dt></dl></dd><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2861728">7.&nbsp;&nbsp;gawk专用正则表达式元字符</a></span></dt><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2861902">8.&nbsp;&nbsp;POSIX字符集</a></span></dt><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2861922">9.&nbsp;&nbsp;匹配操作符(~)</a></span></dt><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2861937">10.&nbsp;&nbsp;比较表达式</a></span></dt><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2861975">11.&nbsp;&nbsp;范围模板</a></span></dt><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2861992">12.&nbsp;&nbsp;一个验证passwd文件有效性的例子</a></span></dt><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2808705">13.&nbsp;&nbsp;几个实例</a></span></dt><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2808824">14.&nbsp;&nbsp;awk编程</a></span></dt><dd><dl><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2808832">14.1.&nbsp;&nbsp;变量</a></span></dt><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2808925">14.2.&nbsp;&nbsp;BEGIN模块</a></span></dt><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2808950">14.3.&nbsp;&nbsp;END模块</a></span></dt><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2808971">14.4.&nbsp;&nbsp;重定向和管道</a></span></dt><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2809145">14.5.&nbsp;&nbsp;条件语句</a></span></dt><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2809263">14.6.&nbsp;&nbsp;循环</a></span></dt><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2809375">14.7.&nbsp;&nbsp;数组</a></span></dt><dt><span class="sect2"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2809497">14.8.&nbsp;&nbsp;awk的内建函数</a></span></dt></dl></dd><dt><span class="sect1"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2876387">15.&nbsp;&nbsp;How-to</a></span></dt></dl></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2874788"></a>1.&nbsp;awk简介</h2></div></div></div><p>awk是一种 编程语言，用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件，或其它命令的输出。它支持用户自定义函数和动态正 则表达式等先进功能，是linux/unix下的一个强大编程工具。它在命令行中使用，但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的， 它逐行扫描文件，从第一行到最后一行，寻找匹配的特定模式的行，并在这些行上进行你想要的操作。如果没有指定处理动作，则把匹配的行显示到标准输出(屏 幕)，如果没有指定模式，则所有被操作所指定的行都被处理。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人，分别是Alfred&nbsp;&nbsp;Aho、Brian Kernighan、Peter&nbsp;&nbsp;Weinberger。gawk是awk的GNU版本，它提供了Bell实验室和GNU的一些扩展。下面介绍的awk是以GUN的gawk为例的，在 linux系统中已把awk链接到gawk，所以下面全部以awk进行介绍。</p></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2875182"></a>2.&nbsp;awk命令格式和选项</h2></div></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2875104"></a>2.1.&nbsp;awk的语法有两种形式</h3></div></div></div><div class="itemizedlist"><ul><li><p>awk [options] 'script'&nbsp;&nbsp;var=value file(s)</p></li><li><p>awk [options] -f scriptfile var=value&nbsp;&nbsp;file(s)</p></li></ul></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2811790"></a>2.2.&nbsp;命 令选项</h3></div></div></div><div class="variablelist"><dl><dt><span class="term">-F fs or --field-separator fs</span></dt><dd><p>指定输入文件折分隔 符，fs是一个字符串或者是一个正则表达式，如-F:。</p></dd><dt><span class="term">-v var=value&nbsp;&nbsp;or --asign var=value</span></dt><dd><p>赋值一个用户定义变量。</p></dd><dt><span class="term">-f scripfile or --file scriptfile</span></dt><dd><p>从脚本文件中读 取awk命令。</p></dd><dt><span class="term">-mf nnn and&nbsp;&nbsp;-mr nnn</span></dt><dd><p>对 nnn值设置内在限制，-mf选项限制分配给nnn的最大块数目；-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能，在标准 awk中不适用。</p></dd><dt><span class="term">-W compact or --compat, </span><span class="term">-W traditional or --traditional</span></dt><dd><p>在兼容模式下运行 awk。所以gawk的行为和标准的awk完全一样，所有的awk扩展都被忽略。</p></dd><dt><span class="term">-W&nbsp;&nbsp;copyleft or --copyleft, </span><span class="term">-W copyright or&nbsp;&nbsp;--copyright</span></dt><dd><p>打印简短的版权信息。</p></dd><dt><span class="term">-W&nbsp;&nbsp;help or --help, </span><span class="term">-W usage or --usage</span></dt><dd><p>打 印全部awk选项和每个选项的简短说明。</p></dd><dt><span class="term">-W lint or --lint</span></dt><dd><p>打 印不能向传统unix平台移植的结构的警告。</p></dd><dt><span class="term">-W lint-old or&nbsp;&nbsp;--lint-old</span></dt><dd><p>打印关于不能向传统unix平台移植的结构的警告。</p></dd><dt><span class="term">-W posix</span></dt><dd><p>打开兼容模式。但有以下限制，不识别：&#92;x、函数关键字、func、 换码序列以及当fs是一个空格时，将新行作为一个域分隔符；操作符**和**=不能代替^和^=；fflush无效。</p></dd><dt><span class="term">-W re-interval or --re-inerval</span></dt><dd><p>允许间隔正则表达式 的使用，参考(grep中的Posix字符类)，如括号表达式[[:alpha:]]。</p></dd><dt><span class="term">-W&nbsp;&nbsp;source program-text or --source program-text</span></dt><dd><p>使用 program-text作为源代码，可与-f命令混用。</p></dd><dt><span class="term">-W version&nbsp;&nbsp; or --version</span></dt><dd><p>打印bug报告信息的版本。</p></dd></dl></div></div></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2810094"></a>3.&nbsp;模式和操作</h2></div></div></div><div class="variablelist"><dl><dt><span class="term">awk脚本是由模式和操作组成的：</span></dt><dd><p>pattern&nbsp;&nbsp;&#123;action&#125; 如$ awk '/root/' test，或$ awk '$3 &lt; 100' test。</p></dd></dl></div><p>&nbsp;&nbsp; 两者是可选的，如果没有模式，则action应用到全部记录，如果没有action，则输出匹配全部记录。默认情况下，每一个输入行都是一条记录，但用户 可通过RS变量指定不同的分隔符进行分隔。 </p><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2810128"></a>3.1.&nbsp;模式</h3></div></div></div><p>模 式可以是以下任意一个：</p><div class="itemizedlist"><ul><li><p>/正则表达式/： 使用通配符的扩展集。</p></li><li><p>关系表达式：可以用下面运算符表中的关系运算符进行操作，可以是字符串或数字的比较， 如$2&gt;%1选择第二个字段比第一个字段长的行。</p></li><li><p>模式匹配表达式：用运算符~(匹配)和~!(不匹配)。</p></li><li><p>模 式，模式：指定一个行的范围。该语法不能包括BEGIN和END模式。</p></li><li><p>BEGIN：让用户指定在第一条输入记录被处理之 前所发生的动作，通常可在这里设置全局变量。</p></li><li><p>END：让用户在最后一条输入记录被读取之后发生的动作。</p></li></ul></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2810236"></a>3.2.&nbsp;操作</h3></div></div></div><p>操 作由一人或多个命令、函数、表达式组成，之间由换行符或分号隔开，并位于大括号内。主要有四部份：</p><div class="itemizedlist"><ul><li><p>变量或数组赋值</p></li><li><p>输出命令</p></li><li><p>内 置函数</p></li><li><p>控制流命令</p></li></ul></div></div></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2810288"></a>4.&nbsp;awk的环境变量</h2></div></div></div><div class="table"><a name="id2810296"></a><p class="title"><strong>Table&nbsp;1.&nbsp;awk的 环境变量</strong></p><table border="1" summary="awk的环境变量"><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>数组下标分隔符(默认值是&#92;034)。</td></tr></tbody></table></div></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2861410"></a>5.&nbsp;awk运算符</h2></div></div></div><div class="table"><a name="id2861418"></a><p class="title"><strong>Table&nbsp;2.&nbsp;运算符</strong></p><table border="1" summary="运算符"><thead><tr><th>运 算符</th><th>描述</th></tr></thead><tbody><tr><td>=&nbsp;&nbsp;+=&nbsp;&nbsp;-=&nbsp;&nbsp;*=&nbsp;&nbsp;/=&nbsp;&nbsp;%=&nbsp;&nbsp;^=&nbsp;&nbsp; **=</td><td>赋值</td></tr><tr><td>?:</td><td>C条件表达式</td></tr><tr><td>&#124;&#124;</td><td>逻 辑或</td></tr><tr><td>&amp;&amp;</td><td>逻辑与</td></tr><tr><td>~&nbsp;&nbsp;~!</td><td>匹 配正则表达式和不匹配正则表达式</td></tr><tr><td>&lt;&nbsp;&nbsp;&lt;=&nbsp;&nbsp;&gt;&nbsp;&nbsp;&gt;=&nbsp;&nbsp;!=&nbsp;&nbsp;==</td><td>关 系运算符</td></tr><tr><td>空格</td><td>连接</td></tr><tr><td>+&nbsp;&nbsp;-</td><td>加，减</td></tr><tr><td>*&nbsp;&nbsp; /&nbsp;&nbsp;&amp;</td><td>乘，除与求余</td></tr><tr><td>+&nbsp;&nbsp;-&nbsp;&nbsp;!</td><td>一元加，减和逻辑非</td></tr><tr><td>^&nbsp;&nbsp; ***</td><td>求幂</td></tr><tr><td>++&nbsp;&nbsp;--</td><td>增加或减少，作为前缀或后缀</td></tr><tr><td>$</td><td>字 段引用</td></tr><tr><td>in</td><td>数组成员</td></tr></tbody></table></div></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2861636"></a>6.&nbsp;记录和域</h2></div></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2861644"></a>6.1.&nbsp;记录</h3></div></div></div><p>awk 把每一个以换行符结束的行称为一个记录。</p><p>记录分隔符：默认的输入和输出的分隔符都是回车，保存在内建变量ORS和RS中。</p><p>$0 变量：它指的是整条记录。如$ awk '&#123;print $0&#125;' test将输出test文件中的所有记录。</p><p>变量NR：一个计数器，每处 理完一条记录，NR的值就增加1。如$ awk '&#123;print NR,$0&#125;' test将输出test文件中所有记录，并在记录前显示记录号。</p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2861680"></a>6.2.&nbsp;域</h3></div></div></div><p>记 录中每个单词称做&ldquo;域&rdquo;，默认情况下以空格或tab分隔。awk可跟踪域的个数，并在内建变量NF中保存该值。如$ awk '&#123;print&nbsp;&nbsp;$1,$3&#125;' test将打印test文件中第一和第三个以空格分开的列(域)。</p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2861697"></a>6.3.&nbsp;域分隔符</h3></div></div></div><p>内建变量 FS保存输入域分隔符的值，默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: '&#123;print $1,$5&#125;'&nbsp;&nbsp;test将打印以冒号为分隔符的第一，第五列的内容。</p><p>可以同时使用多个域分隔符，这时应该把分隔符写成放到方括号中，如$awk&nbsp;&nbsp;-F'[:&#92;t]' '&#123;print $1,$3&#125;' test，表示以空格、冒号和tab作为分隔符。</p><p>输出域的分隔符默认是一个空格，保 存在OFS中。如$ awk -F: '&#123;print $1,$5&#125;' test，$1和$5间的逗号就是OFS的值。</p></div></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2861728"></a>7.&nbsp;gawk专用正则表达 式元字符</h2></div></div></div><p>一般通用的元字符集就不讲了，可参考我的<a href="http://www.ringkee.com/jims/technic_folder/sed.htm" target="_top">Sed</a>和<a href="http://www.ringkee.com/jims/technic_floder/grep.htm" target="_top">Grep</a>学习笔记。以下几个是gawk专用的，不适合unix版本的awk。</p><div class="variablelist"><dl><dt><span class="term">&#92;Y</span></dt><dd><p>匹配一 个单词开头或者末尾的空字符串。</p></dd><dt><span class="term">&#92;B</span></dt><dd><p>匹配单词 内的空字符串。</p></dd><dt><span class="term">&#92;&lt;</span></dt><dd><p>匹配一个单词的开头 的空字符串，锚定开始。</p></dd><dt><span class="term">&#92;&gt;</span></dt><dd><p>匹配一个单 词的末尾的空字符串，锚定末尾。</p></dd><dt><span class="term">&#92;w</span></dt><dd><p>匹配一个 字母数字组成的单词。</p></dd><dt><span class="term">&#92;W</span></dt><dd><p>匹配一个非字母数字 组成的单词。</p></dd><dt><span class="term">&#92;&lsquo;</span></dt><dd><p>匹配字符串开头的一个空字符 串。</p></dd><dt><span class="term">&#92;'</span></dt><dd><p>匹配字符串末尾的一个空字符串。</p></dd></dl></div></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2861902"></a>8.&nbsp;POSIX字符集</h2></div></div></div><p>可 参考我的<a href="http://www.ringkee.com/jims/technic_folder/grep.htm" target="_top">Grep学习笔记</a></p></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2861922"></a>9.&nbsp;匹配操作符(~)</h2></div></div></div><p>用来在 记录或者域内匹配正则表达式。如$ awk '$1 ~/^root/' test将显示test文件第一列中以root开头的行。</p></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2861937"></a>10.&nbsp;比较表达式</h2></div></div></div><p>conditional&nbsp;&nbsp;expression1 ? expression2: expression3，例如：$ awk '&#123;max = &#123;$1 &gt; $3&#125; ?&nbsp;&nbsp;$1: $3: print max&#125;' test。如果第一个域大于第三个域，$1就赋值给max，否则$3就赋值给max。</p><p>$ awk&nbsp;&nbsp;'$1 + $2 &lt; 100' test。如果第一和第二个域相加大于100，则打印这些行。</p><p>$ awk '$1 &gt; 5&nbsp;&nbsp;&amp;&amp; $2 &lt; 10' test,如果第一个域大于5，并且第二个域小于10，则打印这些行。</p></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2861975"></a>11.&nbsp;范围模板</h2></div></div></div><p>范 围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。如果有一个模板没出现，则匹配到开头或末尾。如$ awk&nbsp;&nbsp;'/root/,/mysql/' test将显示root第一次出现到mysql第一次出现之间的所有行。</p></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2861992"></a>12.&nbsp;一个验证 passwd文件有效性的例子</h2></div></div></div><p>&nbsp;</p><pre class="screen"><a name="co.1"></a><img src="http://man.lupaworld.com/content/manage/ringkee/images/callouts/1.png" border="0" alt="1" />$ cat /etc/passwd &#124; awk -F: '&#92;<br /><a name="co.2"></a><img src="http://man.lupaworld.com/content/manage/ringkee/images/callouts/2.png" border="0" alt="2" />NF != 7&#123;&#92;<br /><a name="co.3"></a><img src="http://man.lupaworld.com/content/manage/ringkee/images/callouts/3.png" border="0" alt="3" />printf(&quot;line %d,does not have 7 fields:%s&#92;n&quot;,NR,$0)&#125;&#92;<br /><a name="co.4"></a><img src="http://man.lupaworld.com/content/manage/ringkee/images/callouts/4.png" border="0" alt="4" />$1 !~ /[A-Za-z0-9]/&#123;printf(&quot;line %d,non alpha and numeric user id:%d: %s&#92;n,NR,$0)&#125;&#92;<br /><a name="co.5"></a><img src="http://man.lupaworld.com/content/manage/ringkee/images/callouts/5.png" border="0" alt="5" />$2 == &quot;*&quot; &#123;printf(&quot;line %d, no password: %s&#92;n&quot;,NR,$0)&#125;'<br /></pre><p>&nbsp;</p><div class="calloutlist"><table border="0" summary="Callout list"><tbody><tr><td width="5%" align="left" valign="top"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#co.1"><img src="http://man.lupaworld.com/content/manage/ringkee/images/callouts/1.png" border="0" alt="1" /></a> </td><td align="left" valign="top"><p>cat把结果输出给 awk，awk把域之间的分隔符设为冒号。</p></td></tr><tr><td width="5%" align="left" valign="top"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#co.2"><img src="http://man.lupaworld.com/content/manage/ringkee/images/callouts/2.png" border="0" alt="2" /></a> </td><td align="left" valign="top"><p>如果域的数量 (NF)不等于7，就执行下面的程序。</p></td></tr><tr><td width="5%" align="left" valign="top"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#co.3"><img src="http://man.lupaworld.com/content/manage/ringkee/images/callouts/3.png" border="0" alt="3" /></a> </td><td align="left" valign="top"><p>printf打印字 符串&quot;line ?? does not have 7 fields&quot;，并显示该条记录。</p></td></tr><tr><td width="5%" align="left" valign="top"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#co.4"><img src="http://man.lupaworld.com/content/manage/ringkee/images/callouts/4.png" border="0" alt="4" /></a> </td><td align="left" valign="top"><p>如果第一个域没有包 含任何字母和数字，printf打印&ldquo;no alpha and numeric user id&quot; ，并显示记录数和记录。</p></td></tr><tr><td width="5%" align="left" valign="top"><a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm#co.5"><img src="http://man.lupaworld.com/content/manage/ringkee/images/callouts/5.png" border="0" alt="5" /></a> </td><td align="left" valign="top"><p>如果第二个域是一个 星号，就打印字符串&ldquo;no passwd&rdquo;，紧跟着显示记录数和记录本身。</p></td></tr></tbody></table></div></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2808705"></a>13.&nbsp;几个实例</h2></div></div></div><div class="itemizedlist"><ul><li><p>$ awk '/^(no&#124;so)/'&nbsp;&nbsp;test-----打印所有以模式no或so开头的行。</p></li><li><p>$ awk '/^[ns]/&#123;print $1&#125;'&nbsp;&nbsp;test-----如果记录以n或s开头，就打印这个记录。</p></li><li><p>$ awk '$1&nbsp;&nbsp;~/[0-9][0-9]$/(print $1&#125;' test-----如果第一个域以两个数字结束就打印这个记录。</p></li><li><p>$&nbsp;&nbsp;awk '$1 == 100 &#124;&#124; $2 &lt; 50' test-----如果第一个或等于100或者第二个域小于50，则打印该行。</p></li><li><p>$&nbsp;&nbsp;awk '$1 != 10' test-----如果第一个域不等于10就打印该行。</p></li><li><p>$ awk&nbsp;&nbsp;'/test/&#123;print $1 + 10&#125;' test-----如果记录包含正则表达式test，则第一个域加10并打印出来。</p></li><li><p>$&nbsp;&nbsp;awk '&#123;print ($1 &gt; 5 ? &quot;ok &quot;$1: &quot;error&quot;$1)&#125;'&nbsp;&nbsp;test-----如果第一个域大于5则打印问号后面的表达式值，否则打印冒号后面的表达式值。</p></li><li><p>$ awk&nbsp;&nbsp;'/^root/,/^mysql/'&nbsp;&nbsp;test----打印以正则表达式root开头的记录到以正则表达式mysql开头的记录范围内的所有记录。如果找到一个新的正则表达式root开头的记 录，则继续打印直到下一个以正则表达式mysql开头的记录为止，或到文件末尾。</p></li></ul></div></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2808824"></a>14.&nbsp;awk编程</h2></div></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2808832"></a>14.1.&nbsp;变量</h3></div></div></div><div class="itemizedlist"><ul><li><p>在awk中，变量不需要定义就可以直接使用，变量类型可以 是数字或字符串。</p></li><li><p>赋值格式：Variable = expression，如$ awk '$1&nbsp;&nbsp;~/test/&#123;count = $2 + $3; print count&#125;'&nbsp;&nbsp;test,上式的作用是,awk先扫描第一个域，一旦test匹配，就把第二个域的值加上第三个域的值，并把结果赋值给变量count，最后打印出来。</p></li><li><p>awk 可以在命令行中给变量赋值，然后将这个变量传输给awk脚本。如$ awk -F: -f awkscript month=4 year=2004&nbsp;&nbsp;test，上式的month和year都是自定义变量，分别被赋值为4和2004。在awk脚本中，这些变量使用起来就象是在脚本中建立的一样。注意，如 果参数前面出现test，那么在BEGIN语句中的变量就不能被使用。</p></li><li><p>域变量也可被赋值和修改，如$ awk '&#123;$2&nbsp;&nbsp;= 100 + $1; print &#125;'&nbsp;&nbsp;test,上式表示，如果第二个域不存在，awk将计算表达式100加$1的值，并将其赋值给$2，如果第二个域存在，则用表达式的值覆盖$2原来的值。 再例如：$ awk '$1 == &quot;root&quot;&#123;$1 =&quot;test&quot;;print&#125;'&nbsp;&nbsp;test，如果第一个域的值是&ldquo;root&rdquo;，则把它赋值为&ldquo;test&rdquo;，注意，字符串一定要用双引号。</p></li><li><p>内建变量的使用。 变量列表在前面已列出，现在举个例子说明一下。$ awk -F: '&#123;IGNORECASE=1; $1 == &quot;MARY&quot;&#123;print&nbsp;&nbsp;NR,$1,$2,$NF&#125;'test，把IGNORECASE设为1代表忽略大小写，打印第一个域是mary的记录数、第一个域、第二个域和最后一个 域。</p></li></ul></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2808925"></a>14.2.&nbsp;BEGIN 模块</h3></div></div></div><p>BEGIN模块后紧跟着动作块，这个动作块在awk处理任何输入文件之 前执行。所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值，如OFS,RS和FS等，以及打印标题。如：$ awk&nbsp;&nbsp;'BEGIN&#123;FS=&quot;:&quot;; OFS=&quot;&#92;t&quot;; ORS=&quot;&#92;n&#92;n&quot;&#125;&#123;print $1,$2,$3&#125;&nbsp;&nbsp;test。上式表示，在处理输入文件以前，域分隔符(FS)被设为冒号，输出文件分隔符(OFS)被设置为制表符，输出记录分隔符(ORS)被设置为两个 换行符。$ awk 'BEGIN&#123;print&nbsp;&nbsp; &quot;TITLE TEST&quot;&#125;只打印标题。</p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2808950"></a>14.3.&nbsp;END模块</h3></div></div></div><p>END 不匹配任何的输入文件，但是执行动作块中的所有动作，它在整个输入文件处理完成后被执行。如$ awk 'END&#123;print &quot;The number&nbsp;&nbsp;of records is&quot; NR&#125;' test，上式将打印所有被处理的记录数。</p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2808971"></a>14.4.&nbsp;重定向和管道</h3></div></div></div><div class="itemizedlist"><ul><li><p>awk可使用shell的重定向符进行重定向输出，如：$&nbsp;&nbsp;awk '$1 = 100 &#123;print $1 &gt; &quot;output_file&quot; &#125;'&nbsp;&nbsp;test。上式表示如果第一个域的值等于100，则把它输出到output_file中。也可以用&gt;&gt;来重定向输出，但不清空文件，只做追加 操作。</p></li><li><p>输出重定向需用到getline函数。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件 获得输入。它负责从输入获得下一行的内容，并给NF,NR和FNR等内建变量赋值。如果得到一条记录，getline函数返回1，如果到达文件的末尾就返 回0，如果出现错误，例如打开文件失败，就返回-1。如：</p><p>$ awk 'BEGIN&#123; &quot;date&quot; &#124; getline d;&nbsp;&nbsp;print d&#125;' test。执行linux的date命令，并通过管道输出给getline，然后再把输出赋值给自定义变量d，并打印它。</p><p>$&nbsp;&nbsp;awk 'BEGIN&#123;&quot;date&quot; &#124; getline d; split(d,mon); print mon[2]&#125;'&nbsp;&nbsp;test。执行shell的date命令，并通过管道输出给getline，然后getline从管道中读取并将输入赋值给d，split函数把变量d转 化成数组mon，然后打印数组mon的第二个元素。</p><p>$ awk 'BEGIN&#123;while( &quot;ls&quot; &#124; getline)&nbsp;&nbsp;print&#125;'，命令ls的输出传递给geline作为输入，循环使getline从ls的输出中读取一行，并把它打印到屏幕。这里没有输入文件，因为 BEGIN块在打开输入文件前执行，所以可以忽略输入文件。</p><p>$ awk 'BEGIN&#123;printf &quot;What is your&nbsp;&nbsp;name?&quot;; getline name &lt; &quot;/dev/tty&quot; &#125; $1 ~name &#123;print &quot;Found&quot; name on&nbsp;&nbsp;line &quot;, NR &quot;.&quot;&#125; END&#123;print &quot;See you,&quot; name &quot;.&quot;&#125; test。在屏幕上打印&rdquo;What is your&nbsp;&nbsp;name?&quot;,并等待用户应答。当一行输入完毕后，getline函数从终端接收该行输入，并把它储存在自定义变量name中。如果第一个域匹配变量 name的值，print函数就被执行，END块打印See you和name的值。</p><p>$ awk 'BEGIN&#123;while&nbsp;&nbsp;(getline &lt; &quot;/etc/passwd&quot; &gt; 0) lc++; print&nbsp;&nbsp;lc&#125;'。awk将逐行读取文件/etc/passwd的内容，在到达文件末尾前，计数器lc一直增加，当到末尾时，打印lc的值。注意，如果文件不存 在，getline返回-1，如果到达文件的末尾就返回0，如果读到一行，就返回1，所以命令 while (getline &lt;&nbsp;&nbsp;&quot;/etc/passwd&quot;)在文件不存在的情况下将陷入无限循环，因为返回-1表示逻辑真。</p></li><li><p>可以在awk中打开一个管 道，且同一时刻只能有一个管道存在。通过close()可关闭管道。如：$ awk '&#123;print $1, $2 &#124; &quot;sort&quot; &#125;' test&nbsp;&nbsp;END &#123;close(&quot;sort&quot;)&#125;。awd把print语句的输出通过管道作为linux命令sort的输入,END块执行关闭管道操作。</p></li><li><p>system 函数可以在awk中执行linux的命令。如：$ awk 'BEGIN&#123;system(&quot;clear&quot;)'。</p></li><li><p>fflush 函数用以刷新输出缓冲区，如果没有参数，就刷新标准输出的缓冲区，如果以空字符串为参数，如fflush(&quot;&quot;),则刷新所有文件和管道的输出缓冲区。</p></li></ul></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2809145"></a>14.5.&nbsp;条件语句</h3></div></div></div><p>awk 中的条件语句是从C语言中借鉴过来的，可控制程序的流程。</p><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a name="id2809159"></a>14.5.1.&nbsp;if 语句</h4></div></div></div><pre class="screen">格式：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;if (expression)&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; statement; statement; ...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;</pre><p>$ awk '&#123;if ($1 &lt;$2) print $2 &quot;too high&quot;&#125;'&nbsp;&nbsp;test。如果第一个域小于第二个域则打印。</p><p>$ awk '&#123;if ($1 &lt; $2) &#123;count++; print&nbsp;&nbsp;&quot;ok&quot;&#125;&#125;' test.如果第一个域小于第二个域，则count加一，并打印ok。</p></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a name="id2809192"></a>14.5.2.&nbsp;if/else语句，用于双重判断。</h4></div></div></div><pre class="screen">格式：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;if (expression)&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; statement; statement; ...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; statement; statement; ...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;</pre><p>$ awk '&#123;if ($1 &gt; 100) print $1 &quot;bad&quot; ; else print&nbsp;&nbsp;&quot;ok&quot;&#125;' test。如果$1大于100则打印$1 bad,否则打印ok。</p><p>$ awk '&#123;if ($1 &gt; 100)&#123;&nbsp;&nbsp;count++; print $1&#125; else &#123;count--; print $2&#125;'&nbsp;&nbsp;test。如果$1大于100，则count加一，并打印$1，否则count减一，并打印$1。</p></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a name="id2809231"></a>14.5.3.&nbsp;if/else else if语句，用于多重判断。</h4></div></div></div><pre class="screen">格式：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;if (expression)&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statement; statement; ...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (expression)&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statement; statement; ...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (expression)&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statement; statement; ...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; statement; statement; ...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;</pre></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2809263"></a>14.6.&nbsp;循 环</h3></div></div></div><div class="itemizedlist"><ul><li><p>awk有三种循环:while循环；for循环；special for循环。</p></li><li><p>$&nbsp;&nbsp;awk '&#123; i = 1; while ( i &lt;= NF ) &#123; print NF,$i; i++&#125;&#125;'&nbsp;&nbsp;test。变量的初始值为1，若i小于可等于NF(记录中域的个数),则执行打印语句，且i增加1。直到i的值大于NF.</p></li><li><p>$&nbsp;&nbsp;awk '&#123;for (i = 1; i&lt;NF; i++) print NF,$i&#125;' test。作用同上。</p></li><li><p>breadkcontinue 语句。break用于在满足条件的情况下跳出循环；continue用于在满足条件的情况下忽略后面的语句，直接返回循环的顶端。如：</p><pre class="screen">&#123;for ( x=3; x&lt;=NF; x++) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($x&lt;0)&#123;print &quot;Bottomed out!&quot;; break&#125;&#125;<br />&#123;for ( x=3; x&lt;=NF; x++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($x==0)&#123;print &quot;Get next item&quot;; continue&#125;&#125;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</pre></li><li><p>next语句从输入文件中读取一行，然后从头开始执行awk脚本。如：</p><pre class="screen">&#123;if ($1 ~/test/)&#123;next&#125;<br />&nbsp;&nbsp;&nbsp;&nbsp;else &#123;print&#125;<br />&#125;<br />&nbsp;&nbsp;&nbsp;&nbsp; </pre></li><li><p>exit语句用于结束awk程序，但不会略过END块。退出状态为0代表成功，非零值表示出错。</p></li></ul></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2809375"></a>14.7.&nbsp;数组</h3></div></div></div><p>awk 中的数组的下标可以是数字和字母，称为关联数组。</p><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a name="id2809389"></a>14.7.1.&nbsp;下 标与关联数组</h4></div></div></div><div class="itemizedlist"><ul><li><p>用变量作为数组下标。如：$ awk&nbsp;&nbsp;&#123;name[x++]=$2&#125;;END&#123;for(i=0;i&lt;NR;i++) print i,name[i]&#125;'&nbsp;&nbsp;test。数组name中的下标是一个自定义变量x，awk初始化x的值为0，在每次使用后增加1。第二个域的值被赋给name数组的各个元素。在END 模块中，for循环被用于循环整个数组，从下标为0的元素开始，打印那些存储在数组中的值。因为下标是关健字，所以它不一定从0开始，可以从任何值开始。</p></li><li><p>special&nbsp;&nbsp;for循环用于读取关联数组中的元素。格式如下：</p><pre class="screen">&#123;for (item in arrayname)&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print arrayname[item]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br />&#125;<br /></pre> $ awk '/^tom/&#123;name[NR]=$1&#125;; END&#123;for(i in name)&#123;print name[i]&#125;&#125;'&nbsp;&nbsp;test。打印有值的数组元素。打印的顺序是随机的。 &nbsp;&nbsp;&nbsp;&nbsp;</li><li><p>用字符串作为下标。如：count[&quot;test&quot;]</p></li><li><p>用域值作为数组的下标。一种新的 for循环方式，for (index_value in array) statement。如:$ awk '&#123;count[$1]++&#125;&nbsp;&nbsp;END&#123;for(name in count) print name,count[name]&#125;'&nbsp;&nbsp;test。该语句将打印$1中字符串出现的次数。它首先以第一个域作数组count的下标，第一个域变化，索引就变化。</p></li><li><p>delete 函数用于删除数组元素。如：$ awk '&#123;line[x++]=$1&#125; END&#123;for(x in line) delete(line[x])&#125;'&nbsp;&nbsp;test。分配给数组line的是第一个域的值，所有记录处理完成后，special for循环将删除每一个元素。</p></li></ul></div></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id2809497"></a>14.8.&nbsp;awk的内建函数</h3></div></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a name="id2809505"></a>14.8.1.&nbsp;字符串函数</h4></div></div></div><div class="itemizedlist"><ul><li><p>sub函数匹配记录中最大、最靠左边的子字符串的正则表达 式，并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。格式如下：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub (regular expression, substitution string):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub (regular expression, substitution string, target string)<br /></pre><p>实例：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123; sub(/test/, &quot;mytest&quot;); print &#125;' testfile<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123; sub(/test/, &quot;mytest&quot;); $1&#125;; print &#125;' testfile<br /></pre><p>第一个例子在整个记录中匹配，替换只发生在第一次匹配发生的时候。如要在整个文件中进行匹配需要用到gsub</p><p>第二个例子 在整个记录的第一个域中进行匹配，替换只发生在第一次匹配发生的时候。</p></li><li><p>gsub函数作用如sub，但它在整个文档中进行 匹配。格式如下：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gsub (regular expression, substitution string)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gsub (regular expression, substitution string, target string)<br /></pre><p>实例：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123; gsub(/test/, &quot;mytest&quot;); print &#125;' testfile<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123; gsub(/test/, &quot;mytest&quot;), $1 &#125;; print &#125;' testfile<br /></pre><p>第一个例子在整个文档中匹配test，匹配的都被替换成mytest。</p><p>第二个例子在整个文档的第一个域中匹配，所有匹配 的都被替换成mytest。</p></li><li><p>index函数返回子字符串第一次被匹配的位置，偏移量从位置1开始。格式如下：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index(string, substring)<br /></pre><p>实例：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123; print index(&quot;test&quot;, &quot;mytest&quot;) &#125;' testfile<br /></pre><p>实例返回test在mytest的位置，结果应该是3。</p></li><li><p>length函数返回记录的字符数。格式如 下：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length( string )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length<br /></pre><p>实例：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123; print length( &quot;test&quot; ) &#125;' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123; print length &#125;' testfile<br /></pre><p>第一个实例返回test字符串的长度。</p><p>第二个实例返回testfile文件中第条记录的字符数。</p></li><li><p>substr 函数返回从位置1开始的子字符串，如果指定长度超过实际长度，就返回整个字符串。格式如下：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;substr( string, starting position )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;substr( string, starting position, length of string )<br /></pre><p>实例：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123; print substr( &quot;hello world&quot;, 7,11 ) &#125;' <br /></pre><p>上例截取了world子字符串。</p></li><li><p>match函数返回在字符串中正则表达式位置的索引，如果找不到指定 的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位置，RLENGTH为到子字符串末尾的字符个数。 substr可利于这些变量来截取字符串。函数格式如下：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match( string, regular expression )<br /></pre><p>实例：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123;start=match(&quot;this is a test&quot;,/[a-z]+$/); print start&#125;'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123;start=match(&quot;this is a test&quot;,/[a-z]+$/); print start, RSTART, RLENGTH &#125;'<br /></pre><p>第一个实例打印以连续小写字符结尾的开始位置，这里是11。</p><p>第二个实例还打印RSTART和RLENGTH变量，这里是 11(start)，11(RSTART)，4(RLENGTH)。</p></li><li><p>toupper和tolower函数可用于字符串大 小间的转换，该功能只在gawk中有效。格式如下：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toupper( string )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tolower( string )<br /></pre><p>实例：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123; print toupper(&quot;test&quot;), tolower(&quot;TEST&quot;) &#125;'<br /></pre></li><li><p>split函数可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供，则按当前FS值进行分割。格式如下：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split( string, array, field separator )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split( string, array )<br /></pre><p>实例：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123; split( &quot;20:18:00&quot;, time, &quot;:&quot; ); print time[2] &#125;'<br /></pre><p>上例把时间按冒号分割到time数组内，并显示第二个数组元素18。</p></li></ul></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a name="id2875740"></a>14.8.2.&nbsp;时间函数</h4></div></div></div><div class="itemizedlist"><ul><li><p>systime函数返回从1970年1月1日开始到当前时 间(不计闰年)的整秒数。格式如下：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;systime()<br /></pre><p>实例：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123; now = systime(); print now &#125;'<br /></pre></li><li><p>strftime函数使用C库中的strftime函数格式化时间。格式如下：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;systime( [format specification][,timestamp] )<br /></pre><div class="table"><a name="id2875802"></a><p class="title"><strong>Table&nbsp;3.&nbsp;日 期和时间格式说明符</strong></p><table border="1" summary="日期和时间格式说明符"><thead><tr><th>格 式</th><th>描述</th></tr></thead><tbody><tr><td>%a</td><td>星期几的缩写(Sun)</td></tr><tr><td>%A</td><td>星 期几的完整写法(Sunday)</td></tr><tr><td>%b</td><td>月名的缩写(Oct)</td></tr><tr><td>%B</td><td>月 名的完整写法(October)</td></tr><tr><td>%c</td><td>本地日期和时间</td></tr><tr><td>%d</td><td>十 进制日期</td></tr><tr><td>%D</td><td>日期 08/20/99</td></tr><tr><td>%e</td><td>日 期，如果只有一位会补上一个空格</td></tr><tr><td>%H</td><td>用十进制表示24小时格式的小时</td></tr><tr><td>%I</td><td>用 十进制表示12小时格式的小时</td></tr><tr><td>%j</td><td>从1月1日起一年中的第几天</td></tr><tr><td>%m</td><td>十 进制表示的月份</td></tr><tr><td>%M</td><td>十进制表示的分钟</td></tr><tr><td>%p</td><td>12 小时表示法(AM/PM)</td></tr><tr><td>%S</td><td>十进制表示的秒</td></tr><tr><td>%U</td><td>十 进制表示的一年中的第几个星期(星期天作为一个星期的开始)</td></tr><tr><td>%w</td><td>十进制表示的星期几(星期天是 0)</td></tr><tr><td>%W</td><td>十进制表示的一年中的第几个星期(星期一作为一个星期的开始)</td></tr><tr><td>%x</td><td>重 新设置本地日期(08/20/99)</td></tr><tr><td>%X</td><td>重新设置本地时间(12：00：00)</td></tr><tr><td>%y</td><td>两 位数字表示的年(99)</td></tr><tr><td>%Y</td><td>当前月份</td></tr><tr><td>%Z</td><td>时 区(PDT)</td></tr><tr><td>%%</td><td>百分号(%)</td></tr></tbody></table></div><p>实 例：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123; now=strftime( &quot;%D&quot;, systime() ); print now &#125;'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ awk '&#123; now=strftime(&quot;%m/%d/%y&quot;); print now &#125;'<br /></pre></li></ul></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a name="id2876170"></a>14.8.3.&nbsp;内 建数学函数</h4></div></div></div><div class="table"><a name="id2876177"></a><p class="title"><strong>Table&nbsp;4.&nbsp;</strong></p><table border="1"><thead><tr><th>函数名称</th><th>返 回值</th></tr></thead><tbody><tr><td>atan2(x,y)</td><td>y,x范围内的余切</td></tr><tr><td>cos(x)</td><td>余 弦函数</td></tr><tr><td>exp(x)</td><td>求幂</td></tr><tr><td>int(x)</td><td>取 整</td></tr><tr><td>log(x)</td><td>自然对数</td></tr><tr><td>rand()</td><td>随 机数</td></tr><tr><td>sin(x)</td><td>正弦</td></tr><tr><td>sqrt(x)</td><td>平 方根</td></tr><tr><td>srand(x)</td><td>x是rand()函数的种子</td></tr><tr><td>int(x)</td><td>取 整，过程没有舍入</td></tr><tr><td>rand()</td><td>产生一个大于等于0而小于1的随机数</td></tr></tbody></table></div></div><div class="sect3"><div class="titlepage"><div><div><h4 class="title"><a name="id2876353"></a>14.8.4.&nbsp;自定义函数</h4></div></div></div><p>在 awk中还可自定义函数，格式如下：</p><pre class="screen">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function name ( parameter, parameter, parameter, ... ) &#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statements<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return expression&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# the return statement and expression are optional<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br /></pre></div></div></div><div class="sect1"><div class="titlepage"><div><div><h2 style="clear: both" class="title"><a name="id2876387"></a>15.&nbsp;How-to</h2></div></div></div><div class="itemizedlist"><ul><li><p>如何把一行竖排的数据转换成横排？</p><p>awk&nbsp;&nbsp;'&#123;printf(&quot;%s,&quot;,$1)&#125;' filename</p></li></ul></div></div></div><div id="livemargins_control" style="position: absolute; display: none; z-index: 9999"><img style="position: absolute; left: -77px; top: -5px" src="chrome://livemargins/skin/monitor-background-horizontal.png" border="0" width="77" height="5" />&nbsp;&nbsp;<img style="position: absolute; left: 0pt; top: -5px" src="chrome://livemargins/skin/monitor-background-vertical.png" border="0" />&nbsp;&nbsp;<img id="monitor-play-button" style="position: absolute; left: 1px; top: 0pt; opacity: 0.5; cursor: pointer" src="chrome://livemargins/skin/monitor-play-button.png" onmouseover="this.style.opacity=1" onmouseout="this.style.opacity=0.5" border="0" /></div><br/>Tags - <a href="http://yfyfj.cn/go.php/tags/awk/" rel="tag">awk</a> , <a href="http://yfyfj.cn/go.php/tags/linux/" rel="tag">linux</a>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/post/ssh_authorized_keys.php</link>
<title><![CDATA[ssh 生成密钥]]></title> 
<author>忆风 &lt;web@web.com&gt;</author>
<category><![CDATA[Linux 平台]]></category>
<pubDate>Thu, 24 Jun 2010 04:03:18 +0000</pubDate> 
<guid>http://yfyfj.cn/post/ssh_authorized_keys.php</guid> 
<description>
<![CDATA[ 
	<p><strong>1) 在本地主机生成密钥对</strong></p> <div class="code">ssh-keygen -t rsa</div> <p>这个命令生成一个密钥对：id_rsa（私钥文件）和id_rsa.pub（公钥文件）。默认被保存在~/.ssh/目录下。</p> <p><strong>2) 将公钥添加到远程主机的 authorized_keys 文件中</strong></p> <p>将文件上传到远程主机中</p> <div class="code">scp ~/.ssh/id_rsa.pub root@192.168.1.23:/root/ </div> <p>SSH到登陆到远程主机，将公钥追加到 authorized_keys 文件中</p> <div class="code">cat /root/id_rsa.pub &gt;&gt;&nbsp;&nbsp;/root/.ssh/authorized_keys</div> <p>或直接运行命令:</p> <p>cat ~/.ssh/id_dsa.pub&#124;ssh root@192.168.1.23 'sh -c&nbsp;&nbsp;&quot;cat - &gt;&gt;~/.ssh/authorized_keys2&quot;' </p> <p><strong>3) 重启 open-ssh 服务</strong></p> <div class="code">/etc/init.d/ssh&nbsp;&nbsp;restart</div> <p></p> <p><strong>4) 测试</strong></p> <div class="code">ssh root@192.168.1.23</div> <div class="code">scp /home/onion/.ssh/id_rsa.pub&nbsp;&nbsp;root@192.168.1.23:/root/</div> <p>呵呵，不用输入密码了:)</p> == 附录 ==<br /> /etc/ssd/sshd_config 几个关键配置点<br /> <br /> PermitRootLogin yes<br /> PasswordAuthentication yes<br /> # AuthorizedKeysFile&nbsp;&nbsp; .ssh/authorized_keys&nbsp;&nbsp;# 这个地方尽量使用默认,gentoo 下&nbsp;&nbsp; ~/.ssh/authorized_keys 与 ~/.ssh/authorized_keys2 等效
]]>
</description>
</item><item>
<link>http://yfyfj.cn/post/gnu-gpg-comand.php</link>
<title><![CDATA[GPG常用操作命令]]></title> 
<author>忆风 &lt;web@web.com&gt;</author>
<category><![CDATA[Linux 平台]]></category>
<pubDate>Wed, 23 Jun 2010 08:18:47 +0000</pubDate> 
<guid>http://yfyfj.cn/post/gnu-gpg-comand.php</guid> 
<description>
<![CDATA[ 
	<p>导出私钥命令<br />#gpg &ndash;export-secret-keys -a -o kevin.asc</p><p>导出公钥命令：<br />#gpg -a &ndash;export <a href="mailto:twork@21cn.com">twork@21cn.com</a> &gt;kevin.gpg</p><p>搜索subkeys.pgp.net服务器上的公钥：<br />#gpg &ndash;search-keys &ndash;keyserver subkeys.pgp.net <a href="mailto:twork@21cn.com">twork@21cn.com</a></p><p>你能直接通过 GnuPG 导入密钥</p><pre>gpg --keyserver subkeys.pgp.net --recv-keys B120107B</pre><p>或搜索密钥</p><pre>gpg --keyserver subkeys.pgp.net --search-keys B120107B</pre><p>当你选择其中一个时，它将被加入你的密钥环（keyring）</p><p>上传公钥至subkey.pgp.net服务器：<br />#gpg &ndash;send-keys &ndash;keyserver subkeys.pgp.net <a href="mailto:twork@21cn.com">twork@21cn.com</a></p><p>加数数据给<a href="mailto:king2789@163.com">king2789@163.com</a>(注:-e加密,-a 使用ASCII,-c使用对称加密,-r选择接收人)<br />#gpg -e -a -c -r <a href="mailto:king2789@163.com">king2789@163.com</a> aa.txt</p><p>解密数据(注:如果<a href="mailto:king2789@163.com">king2789@163.com</a>连续5次输错自己的私钥密码，第5次时候可以使用对称密码解密)<br />#gpg -d aa.txt.gpg &gt;aa.txt</p><p>管理GPG的工具有:gpgshell,当前版本3.72<br />下载地址：<a href="http://www.jumaros.de/rsoft/index.html"><a href="http://www.jumaros.de/rsoft/index.html" target="_blank">http://www.jumaros.de/rsoft/index.html</a></a></p><p>常用金钥服务器：<a href="http://subkeys.pgp.net/"><a href="http://subkeys.pgp.net" target="_blank">http://subkeys.pgp.net</a></a><br />#gpg -h (帮助信息)<br />gpg (GnuPG) 1.4.9<br />Copyright (C) 2008 Free Software Foundation, Inc.<br />License GPLv3+: GNU GPL version 3 or later &lt;<a href="http://gnu.org/licenses/gpl.html"><a href="http://gnu.org/licenses/gpl.html" target="_blank">http://gnu.org/licenses/gpl.html</a></a>&gt;<br />This is free software: you are free to change and redistribute it.<br />There is NO WARRANTY, to the extent permitted by law.</p><p>Home: C:/Documents and Settings/Chenkangle/Application Data/gnupg<br />支持的算法：<br />公钥：RSA, RSA-E, RSA-S, ELG-E, DSA<br />对称加密：3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH<br />散列：MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224<br />压缩：不压缩, ZIP, ZLIB, BZIP2</p><p>语法：gpg [选项] [文件名]<br />签名、检查、加密或解密<br />默认的操作依输入数据而定</p><p>指令：</p><p>-s, &ndash;sign [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一份签名<br />&ndash;clearsign [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一份明文签名<br />-b, &ndash;detach-sign&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一份分离的签名<br />-e, &ndash;encrypt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加密数据<br />-c, &ndash;symmetric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 仅使用对称加密<br />-d, &ndash;decrypt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解密数据(默认)<br />&ndash;verify&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 验证签名<br />&ndash;list-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出密钥<br />&ndash;list-sigs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出密钥和签名<br />&ndash;check-sigs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出并检查密钥签名<br />&ndash;fingerprint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出密钥和指纹<br />-K, &ndash;list-secret-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列出私钥<br />&ndash;gen-key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一副新的密钥对<br />&ndash;delete-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从公钥钥匙环里删除密钥<br />&ndash;delete-secret-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从私钥钥匙环里删除密钥<br />&ndash;sign-key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为某把密钥添加签名<br />&ndash;lsign-key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为某把密钥添加本地签名<br />&ndash;edit-key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑某把密钥或为其添加签名<br />&ndash;gen-revoke&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成一份吊销证书<br />&ndash;export&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导出密钥<br />&ndash;send-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把密钥导出到某个公钥服务器上<br />&ndash;recv-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从公钥服务器上导入密钥<br />&ndash;search-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在公钥服务器上搜寻密钥<br />&ndash;refresh-keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从公钥服务器更新所有的本地密钥<br />&ndash;import&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导入/合并密钥<br />&ndash;card-status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打印智能卡状态<br />&ndash;card-edit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更改智能卡上的数据<br />&ndash;change-pin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更改智能卡的 PIN<br />&ndash;update-trustdb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更新信任度数据库<br />&ndash;print-md 算法 [文件]&nbsp;&nbsp;&nbsp; 使用指定的散列算法打印报文散列值</p><p>选项：</p><p>-a, &ndash;armor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出经 ASCII 封装<br />-r, &ndash;recipient 某甲&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为收件者&ldquo;某甲&rdquo;加密<br />-u, &ndash;local-user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用这个用户标识来签名或解密<br />-z N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设定压缩等级为 N (0 表示不压缩)<br />&ndash;textmode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用标准的文本模式<br />-o, &ndash;output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定输出文件<br />-v, &ndash;verbose&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 详细模式<br />-n, &ndash;dry-run&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不做任何改变<br />-i, &ndash;interactive&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 覆盖前先询问<br />&ndash;openpgp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 行为严格遵循 OpenPGP 定义<br />&ndash;pgp2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成与 PGP 2.x 兼容的报文</p><p>(请参考在线说明以获得所有命令和选项的完整清单)</p><p>范例：</p><p>-se -r Bob [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为 Bob 这个收件人签名及加密<br />&ndash;clearsign [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做出明文签名<br />&ndash;detach-sign [文件名]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做出分离式签名<br />&ndash;list-keys [某甲]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示密钥<br />&ndash;fingerprint [某甲]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示指纹</p><br/>Tags - <a href="http://yfyfj.cn/go.php/tags/gpg/" rel="tag">gpg</a> , <a href="http://yfyfj.cn/go.php/tags/gnu/" rel="tag">gnu</a> , <a href="http://yfyfj.cn/go.php/tags/linux/" rel="tag">linux</a>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/post/linux_gpg_file.php</link>
<title><![CDATA[LINUX下GPG加密]]></title> 
<author>忆风 &lt;web@web.com&gt;</author>
<category><![CDATA[Linux 平台]]></category>
<pubDate>Wed, 23 Jun 2010 08:14:01 +0000</pubDate> 
<guid>http://yfyfj.cn/post/linux_gpg_file.php</guid> 
<description>
<![CDATA[ 
	<p><strong>1、生成key</strong></p><p>在windows（需要单独安装）或linux下运行&nbsp;&nbsp;gpg &ndash;gen-key 语句来生成新的密钥数据。</p><p>执行后，系统提示选择密钥种类、密钥位数、过期天数，一切都默认即可，直接回车。然后提示输入用户名，输入后回车；提示输入邮件地址；然后要重复输入两次密码。最后按大写字母O回车，开始生成密钥。这个过程可能会提示随机数不足，这时不能闲着，要多活动活动鼠标，点点按键，产生更多的随机动作，帮助系统继续进行，等待退出即可。</p><p><strong>2、导出公钥</strong></p><p>运行 gpg -o name.gpg -a &ndash;export name 即可导出一个公钥文件。其中name是刚才输入的用户名。这个导出的公钥文件是文本格式可以打开查看，将它公开出去，别人就可以用这个公钥进行加密，加了密的邮件发送给你，你再解密即可。其他人无法解密，即使知道公钥也无法解密，公钥只能用于加密。</p><p><strong>3、加密一个文件</strong></p><p>有了某人的 name.gpg 文件之后，可以用它给要发的邮件内容加密。首先先要下载别人的这个公钥文件，将它导入自己的数据库，方法是运行 gpg &ndash;import name.gpg 。</p><p>运行 gpg -o doc.gpg -er name doc 命令可以将doc文件加密，加密后生成doc.gpg文件，name是所用的公钥主人的用户名。然后将doc.gpg这个加密的文件发送过去即可。因为只有公钥主人可以解密，因此可以公开发送。</p><p><strong>4、解密一个文件</strong></p><p>主人收到这个加密的文件之后，运行 gpg -o doc.new -d doc.gpg 来解密，将doc.gpg解密为一个新的文件doc.new，运行后会提示输入自己的密码。</p><p><strong>5、文件签名</strong></p><p>有时候我们传送一个文件内容，但是担心这个文件内容在中途被别人篡改，怎么才能验证篡改与否呢？一个好办法是将文件内容转换为一组编码，内容与编码完全对应。收到文件的人可以将内容和编码对比验证。如果内容被篡改，编码没有改动，两者将不能匹配。这样达到验证一个文件完整的目的。即使有人想改动编码，也不知道如何改才能与篡改后的内容相一致。</p><p>运行 gpg -o doc.sig &ndash;clearsign doc 命令（会要求输入密码），将文件doc转换为doc.sig，这是一个包含原内容和一组编码的新文件，发送这个新文件即可。收到它的人可以进行验证。</p><p><strong>6、验证签名</strong></p><p>运行 gpg &ndash;verify doc.sig&nbsp;&nbsp;即可验证doc.sig文件中包含的内容+签名。</p><p><strong>7、小结</strong></p><p>上面所写的第1、2、4、5是主人要做的事情，3，6是对方要做的事情。主人生成密码（包括解密的私钥和加密用的公钥），然后导出公钥，发布公钥给对方。对方用公钥加密信息发送给主人，主人用私钥解密信息。主人签名一个文件然后公开发布，大家都可以验证这个信息的完整性。<br /><br /><br />导出私钥<br />gpg --export-secret-keys -a -o exam.secret.gpg<br /><br />导入私钥：<br />gpg --import exam.secret.gpg</p><p>&nbsp;</p><p>信任公钥密钥：<br /></p><pre>When importing a public key onto another machine, you may have configure gpg to<br />trust the key.&nbsp;&nbsp;Otherwise, when you use the key to do encryption, you may<br />see a prompt like this:<br /><br />&nbsp;&nbsp;It is NOT certain that the key belongs to the person named<br />&nbsp;&nbsp;in the user ID.&nbsp;&nbsp;If you *really* know what you are doing,<br />&nbsp;&nbsp;you may answer the next question with yes.<br /><br />&nbsp;&nbsp;Use this key anyway? (y/N) <br /><br />To trust the key, run:<br />&nbsp;&nbsp;gpg --edit-key NAME<br /><br />GPG will output some information, and show a line like:<br />&nbsp;&nbsp;trust: undefined&nbsp;&nbsp;&nbsp;&nbsp; validity: unknown<br /><br />You will be at a console, and you have to type &quot;trust&quot;:<br />&nbsp;&nbsp;Command&gt; trust <br />&nbsp;&nbsp;Please decide how far you trust this user to correctly verify other users' keys<br />&nbsp;&nbsp;(by looking at passports, checking fingerprints from different sources, etc.)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;1 = I don't know or won't say<br />&nbsp;&nbsp;&nbsp;&nbsp;2 = I do NOT trust<br />&nbsp;&nbsp;&nbsp;&nbsp;3 = I trust marginally<br />&nbsp;&nbsp;&nbsp;&nbsp;4 = I trust fully<br />&nbsp;&nbsp;&nbsp;&nbsp;5 = I trust ultimately<br />&nbsp;&nbsp;&nbsp;&nbsp;m = back to the main menu<br /><br />&nbsp;&nbsp;Your decision? 5<br />&nbsp;&nbsp;Do you really want to set this key to ultimate trust? (y/N) y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />Type &quot;quit&quot; to quit.&nbsp;&nbsp;If you run gpg --edit-key NAME again, you will <br />see a line as below, which means the key is now trusted.<br />&nbsp;&nbsp;trust: ultimate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validity: ultimate<br /><br /></pre><br/>Tags - <a href="http://yfyfj.cn/go.php/tags/linux/" rel="tag">linux</a> , <a href="http://yfyfj.cn/go.php/tags/gpg/" rel="tag">gpg</a>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/post/dropbear_ssh_client_setup.php</link>
<title><![CDATA[DD-wrt下SSH TUNNEL 设置方法]]></title> 
<author>忆风 &lt;web@web.com&gt;</author>
<category><![CDATA[Linux 平台]]></category>
<pubDate>Sun, 04 Apr 2010 10:43:05 +0000</pubDate> 
<guid>http://yfyfj.cn/post/dropbear_ssh_client_setup.php</guid> 
<description>
<![CDATA[ 
	<p>刚升级了DD-WRT最新版，&nbsp; 看到下面也有SSH client ，按道理应该也是可以SSH TUNNEL的。 <br /><br />看看他的使用方法吧<br /><br /><a href="mailto:root@ddwrtrouter:/">root@ddwrtrouter:/</a># ssh<br />Dropbear client v0.52<br />Usage: ssh [options] [user@]host[/port][,[user@]host/port],...] [command]<br />Options are:<br />-p &lt;remoteport&gt;<br />-l &lt;username&gt;<br />-t&nbsp;&nbsp;&nbsp; Allocate a pty<br />-T&nbsp;&nbsp;&nbsp; Don't allocate a pty<br />-N&nbsp;&nbsp;&nbsp; Don't run a remote command<br />-f&nbsp;&nbsp;&nbsp; Run in background after auth<br />-y&nbsp;&nbsp;&nbsp; Always accept remote host key if unknown<br />-s&nbsp;&nbsp;&nbsp; Request a subsystem (use for sftp)<br />-i &lt;identityfile&gt;&nbsp;&nbsp; (multiple allowed)<br />-L &lt;listenport:remotehost:remoteport&gt; Local port forwarding<br />-g&nbsp;&nbsp;&nbsp; Allow remote hosts to connect to forwarded ports<br />-R &lt;listenport:remotehost:remoteport&gt; Remote port forwarding<br />-W &lt;receive_window_buffer&gt; (default 24576, larger may be faster, max 1MB)<br />-K &lt;keepalive&gt;&nbsp; (0 is never, default 0)<br />-I &lt;idle_timeout&gt;&nbsp; (0 is never, default 0)<br />-B &lt;endhost:endport&gt; Netcat-alike forwarding<br />-J &lt;proxy_program&gt; Use program pipe rather than TCP connection<br /><br /><br />1、Local port forwarding<br /><br /><a href="mailto:root@ddwrtroute:/#ssh">root@ddwrtroute:/#ssh</a> -f -N -L 1234:<a href="http://www.google.com:80" target="_blank">www.google.com:80</a> -g test@<a href="http://www.test.com" target="_blank">www.test.com</a><br /><br />-N&nbsp;不执行远程命令 -f 认证后再后台运行 -L 本地端口转发 -g 绑定到本地地址0.0.0.0， 如果没使用 -g 参数，则是绑定到127.0.0.1<br /><br />上面的命令就是 访问 路由器:1234&nbsp; 就直接访问到了<a href="http://www.google.com.hk/"><a href="http://www.google.com.hk" target="_blank">www.google.com.hk</a></a>了<br /><br />2、Remote port forwarding 暂未试用<br /><br /></p><br/>Tags - <a href="http://yfyfj.cn/go.php/tags/dropbear/" rel="tag">dropbear</a> , <a href="http://yfyfj.cn/go.php/tags/ssh/" rel="tag">ssh</a> , <a href="http://yfyfj.cn/go.php/tags/client/" rel="tag">client</a>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/post/install_c_and_gcc.php</link>
<title><![CDATA[Ubuntu安装C编译器和GCC编译器]]></title> 
<author>忆风 &lt;web@web.com&gt;</author>
<category><![CDATA[Linux 平台]]></category>
<pubDate>Fri, 26 Mar 2010 08:07:06 +0000</pubDate> 
<guid>http://yfyfj.cn/post/install_c_and_gcc.php</guid> 
<description>
<![CDATA[ 
	<p>安装了最小化版的Ubuntu，&nbsp; 没有带c，gcc编译器， make大部分软件都没办法， 只能安装一下环境<br /><br />命令如下:<br /><br />sudo aptitude install build-essential<br /><br />sudo apt-get install gcc<br /><br />就可以写个c程序，测试一下环境了<br /><br /><br />cc -c test.c<br />cc -p test.c<br />./test<br /><br /><br /></p><br/>Tags - <a href="http://yfyfj.cn/go.php/tags/c/" rel="tag">c</a> , <a href="http://yfyfj.cn/go.php/tags/gcc/" rel="tag">gcc</a>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/read.php/148.htm</link>
<title><![CDATA[VPN建立方法]]></title> 
<author>yfyfj &lt;admin@yourname.com&gt;</author>
<category><![CDATA[Linux 平台]]></category>
<pubDate>Tue, 22 Dec 2009 13:30:32 +0000</pubDate> 
<guid>http://yfyfj.cn/read.php/148.htm</guid> 
<description>
<![CDATA[ 
	<h4>一、开通vpn</h4><ol><li>登录，<a href="http://rapidxen.net/plans" target="_blank"><span style="color: #6699cc"><a href="http://rapidxen.net/plans" target="_blank">http://rapidxen.net/plans</a></span></a> </li><li>点选7.49刀的第一个方案（优惠代码大家可以搜索 rapidxen coupon） </li><li>填写资料，在OS中选择Ubuntu 9.04 x64版本 </li><li>提交、付钱（paypal）、等待 </li><li>收到系统开通的email之后，登录后台，在logs里面找到root密码。 </li></ol><h4>二、连接服务器并安装服务</h4><ol><li>推荐win下的同学使用<a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" target="_blank"><span style="color: #6699cc">PuTTY</span></a>连接客户端。 </li><li>在Host Name处填写vps的ip地址，连接 </li><li>用root跟你得到的root密码登录。 </li><li>安装PPTPD <pre>apt-get install pptpd</pre></li><li>安装nano（如果你能够熟练的使用vi，可以省略这一步） <pre>apt-get install nano</pre></li><li>编辑pptpd.conf文件 <pre>nano /etc/pptpd.conf</pre>使得非注释内容如下： <pre>option /etc/ppp/pptpd-options<br />localip 192.168.0.1<br />remoteip 192.168.0.234-238,192.168.0.245<br />&nbsp;&nbsp;&nbsp;&nbsp;</pre></li><li>添加登录用户 <pre>nano /etc/ppp/chap-secrets</pre>添加一行，内容如下 <pre>你想要的用户名&nbsp;&nbsp;pptpd&nbsp;&nbsp;&quot;你想要的密码&quot;&nbsp;&nbsp;*</pre>密码用半角双引号括起来 </li><li>编辑pptpd-options <pre>nano /etc/ppp/pptpd-options</pre>找到ms-dns，取消掉注释，并修改dns地址（推荐Opendns或者Google dns） </li><li>开启转发 <pre>nano /etc/sysctl.conf</pre>取消如下内容行的注释 <pre>net.ipv4.ip_forward = 1</pre></li><li>安装iptables并设置 <pre>apt-get install iptables<br />iptables -t nat -I POSTROUTING -j MASQUERADE <br />&nbsp;&nbsp;&nbsp;&nbsp;</pre></li><li>一个不知道什么作用的命令（汗，得恶补linux知识了），我自己运行了这条命令 <pre>echo 1 &gt; /proc/sys/net/ipv4/ip_forward</pre></li><li>启动服务 <pre>/etc/init.d/pptpd restart</pre></li><li>VPN搭建完毕，可以尝试用客户端登录了</li></ol>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/read.php/110.htm</link>
<title><![CDATA[修改linux默认语言和ssh端口]]></title> 
<author>yfyfj &lt;admin@yourname.com&gt;</author>
<category><![CDATA[Linux 平台]]></category>
<pubDate>Fri, 17 Jul 2009 03:18:17 +0000</pubDate> 
<guid>http://yfyfj.cn/read.php/110.htm</guid> 
<description>
<![CDATA[ 
	<p>修改linux的默认语言<br /><br />cd /root<br />vi .bash_profile<br /><br />加入<br /><br />LANG=en_US.UTF-8<br /><br /><br /><br /><br />修改默认的SSH 端口<br /><br />vi /etc/ssh/sshd_config <br /><br />把#port 22<br />改成 port 65022<br /><br />再/etc/init.d/sshd restart 或 service sshd restart<br /></p><br/>Tags - <a href="http://yfyfj.cn/go.php/tags/ssh%25E7%25AB%25AF%25E5%258F%25A3/" rel="tag">ssh端口</a>
]]>
</description>
</item><item>
<link>http://yfyfj.cn/read.php/103.htm</link>
<title><![CDATA[ifstat rpm包下载]]></title> 
<author>忆风 &lt;web@web.com&gt;</author>
<category><![CDATA[Linux 平台]]></category>
<pubDate>Tue, 10 Feb 2009 15:09:20 +0000</pubDate> 
<guid>http://yfyfj.cn/read.php/103.htm</guid> 
<description>
<![CDATA[ 
	ifstat rpm包下载<br /><br /><a href="http://dag.wieers.com/rpm/packages/ifstat/"><a href="http://dag.wieers.com/rpm/packages/ifstat/" target="_blank">http://dag.wieers.com/rpm/packages/ifstat/</a></a><br/>Tags - <a href="http://yfyfj.cn/go.php/tags/ifstat/" rel="tag">ifstat</a>
]]>
</description>
</item>
</channel>
</rss>