﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-尽我所能，一步一个脚印-随笔分类-linux脚本编程</title><link>http://www.blogjava.net/terrylc/category/47218.html</link><description>贵在执着</description><language>zh-cn</language><lastBuildDate>Tue, 01 Mar 2011 22:23:24 GMT</lastBuildDate><pubDate>Tue, 01 Mar 2011 22:23:24 GMT</pubDate><ttl>60</ttl><item><title>Write basic awk script</title><link>http://www.blogjava.net/terrylc/archive/2011/03/01/345427.html</link><dc:creator>terrylc</dc:creator><author>terrylc</author><pubDate>Tue, 01 Mar 2011 12:54:00 GMT</pubDate><guid>http://www.blogjava.net/terrylc/archive/2011/03/01/345427.html</guid><wfw:comment>http://www.blogjava.net/terrylc/comments/345427.html</wfw:comment><comments>http://www.blogjava.net/terrylc/archive/2011/03/01/345427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terrylc/comments/commentRss/345427.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terrylc/services/trackbacks/345427.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; awk的基础编程，我想分为五个部分来总结<br />
<br />
<h1>awk程序设计模型</h1>
&nbsp;&nbsp;&nbsp;
对于awk的学习，了解awk程序的基本设计模型是很有意思的<br />
<br />
<fieldset><legend></legend>awk程序的脚本通常是有三个部分组成的：<br />
* 处理输入前的动作-----BEGIN{}<br />
* 处理输入的动作-----模式匹配以及Action<br />
* 处理完输入后的动作-----END{}
</fieldset>&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; awk的主输入循环是核心，这是awk本身来控制和管理的，程序员只是需要根据具体的需求编写控制和操作指令就可以了。<br />
<br />
&nbsp;&nbsp;&nbsp;
主输入循环也就是上面提到的模式匹配以及Action，有如下几个很重要的特点：<br />
<br />
<fieldset><legend></legend>* 模式和Action应用于每个输入行，而且是每行一次，一次一行<br />
* 程序员编写的核心程序被封装在模式和动作中<br />
* 循环终止与否是有awk来控制的<br />
</fieldset><br />
<h1>模式匹配</h1>
<fieldset>
<h3>记住一句话<br />
</h3>
当awk读取一输入行的时候，它试图匹配脚本中的每个模式匹配规则，只有与一个特定的的模式匹配的 输入行才能有资格成为操作对象，如果没有指定操作对象，与模式相匹配的输入行将被打印出来<br />
(执行打印语句是一个默认操作)。<br />
</fieldset><br />
<h1>变量</h1>
<fieldset>
* 系统变量<br />
FS：字段分割符，可以采用默认的分割符，还有一种方式是在BEGIN中指定FS，FS支持正则表达式。<br />
NR：记录数<br />
NF：行中字段数<br />
RS：记录分割符 <br />
OFS：和FS等效的输出字段分割符，默认值也是空格<br />
ORS：和RS等效的输出行分割符，默认值也是一个换行符<br />
FILENAME：当前输入文件的文件名<br />
ARGIND：用于判定执行那个输入文件<br />
<br />
* 用户自定义变量<br />
用户可以在任何地方定义变量，可以直接使用，不像java一样需要申明。<br />
<br />
* 字段引用<br />
对于字段的引用，我们可以$来表示<br />
<br />
* 向脚本传递参数<br />
<br />
awk&nbsp; -v&nbsp; RS=" "&nbsp; 'scripts' a.txt <br />
说明参数必须在脚本之前指定，解决了命令行参数在BEGIN中不能使用的问题<br />
</fieldset><br />
<h1>操作符</h1>
<fieldset>
<h3>几种重要的操作符<br />
</h3>
* 赋值操作符<br />
++x和x++的区别，前者代表的是先++再返回值，后者代表的是先返回值，然后自身再++<br />
<br />
* 关系操作符<br />
$5 ～ /regex/ {}<br />
!：代表是逻辑非<br />
<br />
</fieldset><br />
<h1>注意点</h1>
<fieldset><legend></legend>* awk容许在程序的任何地方添加注释<br />
<br />
* 在awk中连接两个字符串使用空格<br />
<br />
* 如果以命令行方式提供awk程序，那么程序的其他任何地方不能使用单引号<br />
<br />
* 在BEGIN中制定的分割符的正则表达式使用&#8220;&#8221;，而不像其他的时候使用//<br />
</fieldset><br />
<img src ="http://www.blogjava.net/terrylc/aggbug/345427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terrylc/" target="_blank">terrylc</a> 2011-03-01 20:54 <a href="http://www.blogjava.net/terrylc/archive/2011/03/01/345427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Awk’s basic  regex</title><link>http://www.blogjava.net/terrylc/archive/2011/03/01/345044.html</link><dc:creator>terrylc</dc:creator><author>terrylc</author><pubDate>Tue, 01 Mar 2011 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/terrylc/archive/2011/03/01/345044.html</guid><wfw:comment>http://www.blogjava.net/terrylc/comments/345044.html</wfw:comment><comments>http://www.blogjava.net/terrylc/archive/2011/03/01/345044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terrylc/comments/commentRss/345044.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terrylc/services/trackbacks/345044.html</trackback:ping><description><![CDATA[<h1>&nbsp;
基础概念</h1>
&nbsp;&nbsp;&nbsp; 正则表达式是非常有魅力的知识，不同的人对于同一的需求都能写出不同的正则表达式。这就是能力的体现，也是对正在表达式理解的深度，运用熟练的显然差别。<br />
<br />
&nbsp;&nbsp;&nbsp; 以前时常使用正则表达式，比如在java中，在php中，但是都没有系统的学习过它，只是知道它很强大！目前由于工作需要开始使用awk和sed，那么很显然正则表达式的使用就不能逃避了。<br />
<br />
&nbsp;&nbsp;&nbsp; 那接下来，我一步步记录日常使用的点点滴滴。<br />
<br />
<fieldset><legend><strong>正则表达式定义</strong></legend>正则表达式是一种描述字符串结构模式的形式化表达语言。<br />
</fieldset><br />
<br />
<fieldset><legend><strong>正则表达式调用流程</strong></legend>*&nbsp;首先程序解析正则表达式产生一个模式，然后读取输入行<br />
<br />
*&nbsp;程序将输入行拿来与模式进行匹配<br />
<br />
*&nbsp;输入行的第一个字符与模式的第一个字符进行比较，如果匹配，则比较两者的第二个字符，无能何时，只要匹配不失败，就返回并且从字符串中这个字符后面的字符重新开始匹配，从匹配模式的第一行从新开始。</fieldset><br />
<fieldset><legend><strong>正则表达式的解析原则</strong></legend>任意字符(除了元字符)都被解释为只匹配它本身字面值。<br />
</fieldset><br />
<h1>&nbsp;元字符汇总</h1>
&nbsp; 很显然，我们很希望了解神秘的元字符，下面我就分类总结下这些元字符：<br />
<br />
<fieldset>
<h3><strong><strong>字符类</strong></strong></h3>
使用符号：&nbsp;&nbsp; []<br />
<br />
作用:&nbsp;&nbsp; 规定某个位置能够出现的字符，记住只是匹配一个字符而已。<br />
<br />
说明：&nbsp;&nbsp; 匹配方括号中字符类的任意一个，如果方括号中第一个字符为^,则表示否定匹配，第一字符是-代表的是字符本身，其他时候代表的是范围连字符。其他所有的原字符都将失去它们原有的含义。<br />
<br />
Note：&nbsp;&nbsp; 字符类的简记法<br />
\d=[0-9]<br />
\D=[^0-9]<br />
\w=[0-9a-zA-Z]<br />
\W=[^0-9a-zA-Z]<br />
\s:匹配空白字符(回车，换行，制表，空格)<br />
\S:匹配非空白字符<br />
</fieldset><br />
<br />
<fieldset>
<h3>通配符<br />
</h3>
使用符号：&nbsp;&nbsp; .<br />
<br />
作用：&nbsp;&nbsp; 匹配任意单个字符<br />
<br />
说明：&nbsp;&nbsp; 在一般应用中不能匹配换行，但是在awk中却可以匹配换行符<br />
<br />
<br />
</fieldset><br />
<br />
<fieldset>
<h3>量词</h3>
<p>使用符号：&nbsp;&nbsp; *,+,?,\{m,n\},{m,n}</p>
<p><br />
</p>
作用：&nbsp;&nbsp; 限定紧跟在它前面字符出现的次数<br />
<br />
说明： &nbsp; * 代表匹配前面的字符0次或者多次，+代表匹配前面的字符1次或者多次，？代表匹配前面的字符0次或者1次，{m,n}代表前面的字符出现区间在m和n之间</fieldset><br />
<fieldset>
<h3>括号<br />
</h3>
使用符号： &nbsp; ()<br />
<br />
作用： &nbsp; 对正则表达式进行分组<br />
<br />
说明： &nbsp; * 代表匹配前面的字符0次或者多次，+代表匹配前面的字符1次或者多次，？代表匹配前面的字符0次或者1次，{m.n}代表前面的字符出现区间在m和n之间.<br />
<br />
Note:&nbsp;&nbsp; 其中存在文本捕获跟不捕获的问题，在这里我不详细记录了，用到自己查找资料。<br />
</fieldset><br />
<fieldset>
<h3>锚点<br />
</h3>
使用符号:&nbsp;&nbsp; \b,^,$<br />
<br />
作用:&nbsp;&nbsp; 确定匹配位置<br />
<br />
说明:&nbsp;&nbsp; \b代表单词分界符的锚点，每个单词前后都是存在一个\b,例如\bcat\b,<br />
</fieldset><br />
<fieldset>
<h3>常用正则表达式<br />
</h3>
<p>用户名</p>
<p>/^[a-z0-9_-]{3,16}$/</p>
<p>密码</p>
<p>/^[a-z0-9_-]{6,18}$/</p>
<p>十六进制值</p>
<p>/^#?([a-f0-9]{6}|[a-f0-9]{3})$/</p>
<p>电子邮箱</p>
<p>/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/</p>
<p>URL</p>
<p>/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/</p>
<p>IP 地址</p>
<p>/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/</p>
<p>HTML 标签</p>
<p>/^&lt;([a-z]+)([^&lt;]+)*(?:&gt;(.*)&lt;\/\1&gt;|\s+\/&gt;)$/</p>
<p>Unicode编码中的汉字范围</p>
<p>/^[\u2E80-\u9FFF]+$/</p>
</fieldset><br />
<img src ="http://www.blogjava.net/terrylc/aggbug/345044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terrylc/" target="_blank">terrylc</a> 2011-03-01 16:59 <a href="http://www.blogjava.net/terrylc/archive/2011/03/01/345044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Awk-script1</title><link>http://www.blogjava.net/terrylc/archive/2011/02/18/344596.html</link><dc:creator>terrylc</dc:creator><author>terrylc</author><pubDate>Fri, 18 Feb 2011 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/terrylc/archive/2011/02/18/344596.html</guid><wfw:comment>http://www.blogjava.net/terrylc/comments/344596.html</wfw:comment><comments>http://www.blogjava.net/terrylc/archive/2011/02/18/344596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/terrylc/comments/commentRss/344596.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/terrylc/services/trackbacks/344596.html</trackback:ping><description><![CDATA[需求：根据给定的学生成绩表，统计每个学生的平均成绩，字母等级，全班的平均成绩。<br />
班级的学生成绩表信息如下：<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">mona&nbsp;</span><span style="color: rgb(0, 0, 0);">70</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">77</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">85</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">83</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">70</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">89</span><span style="color: rgb(0, 0, 0);"><br />
john&nbsp;</span><span style="color: rgb(0, 0, 0);">85.92</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">78</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">94</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">88</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">91</span><span style="color: rgb(0, 0, 0);"><br />
andrea&nbsp;</span><span style="color: rgb(0, 0, 0);">89</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">90</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">85</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">94</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">90</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">95</span><span style="color: rgb(0, 0, 0);"><br />
jasper&nbsp;</span><span style="color: rgb(0, 0, 0);">84</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">88</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">80</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">92</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">84</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">82</span><span style="color: rgb(0, 0, 0);"><br />
dunce&nbsp;</span><span style="color: rgb(0, 0, 0);">64</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">80</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">60</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">60</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">61</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">62</span><span style="color: rgb(0, 0, 0);"><br />
ellis&nbsp;</span><span style="color: rgb(0, 0, 0);">90</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">98</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">89</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">96</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">96</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">92</span><span style="color: rgb(0, 0, 0);"><br />
</span></div>
<br />
<br />
#grade.awk -- cacl student grade<br />
BEGIN{<br />
FS = " "<br />
}<br />
{total = 0;<br />
for (i=2;i&lt;=NF; i++)<br />
total += $i<br />
avg = total /(NF -1)<br />
#将学生平均成绩付给数组元素<br />
student_avg[NR] == AVG<br />
#确定字母等级<br />
if (avg &gt;= 90) grade = "A"<br />
else if (avg &gt;= 80) grade = "B"<br />
else if (avg &gt;=70) grade = "C"<br />
else if (avg &gt;=60) grade = "D"<br />
else grade = "F"<br />
++class_grade [grade]<br />
print $1,avg,grade<br />
<br />
}<br />
END{<br />
for(x = 1;i &lt;= NR;x++)<br />
class_avg_total += student_avg[x]<br />
class_average = class_avg_total /NR<br />
for(x =1; x&lt;=NR; x++)<br />
if (student_avg[x] &gt;= class_average)<br />
++above_average<br />
else<br />
++below_average<br />
<br />
print ""<br />
print "Class Average:",class_average<br />
print "At or Above Average:",above_average<br />
print "Below Average:",below_average<br />
#打印每个字母等级的学生数<br />
for(letter_grade in class_grade)<br />
print letter_grade ":",class_grade[letter_grade]|<wbr>"sort"<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;<wbr>&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;<wbr>&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;<wbr>&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;<wbr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<img src ="http://www.blogjava.net/terrylc/aggbug/344596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terrylc/" target="_blank">terrylc</a> 2011-02-18 09:33 <a href="http://www.blogjava.net/terrylc/archive/2011/02/18/344596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>