发布新日志

  • shell-文本处理工具

    2015-01-23 06:59:10

    排序文本
    含有独立数据记录的文本文件,通常都可以拿来排序。
    Sort将输入看作具有多条记录的数据流,而记录是由可变宽的字段组成,记录是以换行字符作为定界符
    ,字段的定界符则是空白字符或是用户指定的单个字符。
    sort [options]  [files]
    行的排序
    未提供命令行选项时,整个记录都会根据当前locale所定义的次序排序。排序的惯例,完全视语言,国
    家以及文化而定。
    以字段排序
    如果要进一步控制排序操作,可以用-k选项指定排序字段,并且用-t选项来选择字段定界符。
    如未指定-t, 则表示字段以空白分隔且记录内开头与结尾的空白都将忽略,如指定-t选项,则被指定的
    字段会分隔字段,且空白是有意义的。
    -k 选项的后面接着的是一个字段编号,或者是一对数字,有时在-k之后可用空白分隔,每个编号后面都
    可以接一个点号的字符位置,及/或修饰符字母之一。
    如果仅指定一个字段编号,则排序键值会自该字段的起始处开始,一直继续到记录的结尾(而非字段的结
    尾)
    如果给的是一对用逗号隔开的字段数字,则排序键值将由第一个字段值的起始处开始,结束于第二个字
    段值的结尾。
    如果使用点号字符位置,则比较的开始或结束在该字符位置处
    如果一个排序键值的起始正好落在记录的结尾处之后,则排序键值为空,且空的排序键值在排序时将优
    先于所有非空的键值。
    当出现多个 -k选项时,会先从第一个键值字段开始排序,找出匹配该键值的记录后,再进行第二个键值
    字段的排序。
    删除重复
    sort -u 消除操作是根据匹配的键值,而非匹配的记录,uniq命令提供另一种过滤数据的方式,它常用

    于管道中,用来删除已使用sort排序完成的重复记录
    sort ... | uniq | ....
    uniq有3个好用的选项, -c可在每个输出行之前加上该行重复的次数 -d选项则用于仅显示重复的行,而
    -u仅显示未重复的行。
    格式化段落
    fmt 
    -s 选项仅切割较长的行,但不会将短行结合成较长的行,而-w n则设置输出行宽度为n 个字符
    计算行数,字数以及字节数
    wc 默认输出是一行报告,包括行数,字数以及字节数
    要求仅输出部分结果时,可使用选项 -c 字节数 -l 行数 -w 字数 -m 计算多字节字符
    wc最常处理的是来自于管道的输入数据,但它也接受命令行的文件参数,可以生成一行一个结果,再附
    上报告。
    wc的新版本会随local而有不同结果,将环境变量LC_CTYPE设为想用的locale,会影响wc把字节序列解释
    为字符或单词的分隔器。
    提取开头或结尾数行
    head -n n
    sed -e nq
    tail -n n
    tail -n n -f  -f要求tail显示指定的文件结尾行数,接着进入无止尽的循环中,休息一秒后又再度醒
    来并检查是否需显示更多的输出结果。 在设置-f时,tail只有当你中断时才会停止,通常用Control+C
    来中断
    由于tail加上-f 选项后便不会自己中断,所以此选项不可用于Shell脚本。
    dd 以用户指定的的块大小与数据拷贝数据,可以进行大小写转换,以及ASCII与EBCDIC间的转换
    file 将其参数文件内容的前几个字节,与样式数据库进行比对,再在标准输出下,针对各文件显示一行
    简短报告
  • shell-查找与替换

    2015-01-20 22:29:12

    文本查找--寻找含有特定文本的行 
    文本替换--更换找到的文本
    用grep程序查找文本,grep最简单的用法就是使用固定字符串
    语法 grep [options] pattern-spec [files..]
    正则表达式
    正则表达式是一种表示方法,让你可以查找匹配特定准则的文本。
    正则表达式是由两个基本组成部分所建立,一般字符与特殊字符。一般字符指的是任何没有特殊意义额字符,特殊字符常称为元字符。有些情况下,特殊字符也可以视为一般字符。
    基本正则表达式
    匹配单个字符
    一般字符包括所有文字和数字字符,绝大多数的空白字符以及标点符号字符。因此,正则表达式a 匹配于字符a,一般字符所表示的就是它们自己。
    meta字符不能表示他们自己,需要表示他们自己的时候需要转义,加反斜杠(\)
    点(.)字符为任一字符,因为a.c匹配abc,aac,acc等,
    方括号([]),最简单的方括号表达式就是直接将字符串列表放在方括号里。c[aeiou]t匹配与cat,cet等,但不保活cbt等。
    在方括号里,^放在字首表示是取反。也就是不在方括号里的任一字符。c[^aeiou]t,可表示cbe,但不保活cat.
    方括号表达式可以包括字符的范围,[1--9],[a--f]
    排序是指给予成组的项目排列顺序的操作
    等价字符集用来让不同字符在匹配时视为相同字符。
    字符集,它表示字符的类别,例如数字,小写与大写字母,标点符号,空白等,这些类别名称定义于[:与:]之间
    在方括号表示式中,所有其他的meta字符都会失去其特殊含义,所以[*\.]匹配于字面上的星号,反斜杠以及句号,要让]进入该集合,可以将它放在列表的最前面,[]*\.], 将]增加至此列表中,要让减号字符进入该集合,也请将它放到列表的最前端[-*\.],若你需要右方括号与减号两者进入列表,将右括号放在第一个字符,减号放到最后一个字符[]*\.-]
    NULL字符(数值的零)不需要是可匹配的。
    向后引用
    向后引用的机制指的是匹配于正则表达式匹配的先前的部分。使用向后引用的步骤有两个,第一步是将子表达式包围在\(与\)里。单个模式里可包括至多9个子表达式,且可为嵌套结构
    digit指的是介于1到9的数字
    单个表达式匹配多个字符
    匹配多个字符最简单的方法就是把他们一个接一个连接列出来,所以正则表达式ab匹配ab
    两个点号(..)匹配任一两个字符[:upper:][:lower:]则匹配于任意一个大写字符,后面接着任意一个小写字符。
    修饰符(*)表示匹配0个或多个前面的单个字符,ab&c可以表示ac,abc,abbc 0个或多个b
    区间表达式,可以表明需要匹配的次数
    \{n\} 前置正则表达式所得结果出现n次
    \{n,\} 前置正则表达式所得的结果重现至少n次
    \{n,m\}前置正则表达式所得的结果重现n至m次
    文本匹配锚点
    脱字符号(^)与货币符号($)叫做锚点,其用途在限制正则表达式匹配时,针对要被匹配字符串的开始或结尾处进行匹配。(^在此处的用法与方括号表达式里的完全不同)
    ^用于字符串开始匹配,&用于字符串结尾处进行匹配。
    ^与$可同时使用,这种情况是将括起来的正则表达式匹配整个字符串。
    ^$用来匹配空的字符串或行列
    BRE 基本正则表达式
    ERE 扩展正则表达式
    ERE有另两个meata字符
    匹配单个正则表达式与多个正则表达式
    ? 匹配于0个或一个前置正则表达式 ab?c, ac,abc
    + 匹配于1个或多个前置正则表达式,ab+c,, abc,abbc,abbbc
    交替
    交替运算符,即垂直的一条线,称为管道字符| read|write匹配于read与write两者。
    分组
    在ERE里,运算符是被应用到前置的正则表达式。
    正则表达式的扩展
    \<与\>运算符,分别匹配单词的开头和结尾

  • shell-查找与替换

    2015-01-20 22:29:12

    文本查找--寻找含有特定文本的行 
    文本替换--更换找到的文本
    用grep程序查找文本,grep最简单的用法就是使用固定字符串
    语法 grep [options] pattern-spec [files..]
    正则表达式
    正则表达式是一种表示方法,让你可以查找匹配特定准则的文本。
    正则表达式是由两个基本组成部分所建立,一般字符与特殊字符。一般字符指的是任何没有特殊意义额字符,特殊字符常称为元字符。有些情况下,特殊字符也可以视为一般字符。
    基本正则表达式
    匹配单个字符
    一般字符包括所有文字和数字字符,绝大多数的空白字符以及标点符号字符。因此,正则表达式a 匹配于字符a,一般字符所表示的就是它们自己。
    meta字符不能表示他们自己,需要表示他们自己的时候需要转义,加反斜杠(\)
    点(.)字符为任一字符,因为a.c匹配abc,aac,acc等,
    方括号([]),最简单的方括号表达式就是直接将字符串列表放在方括号里。c[aeiou]t匹配与cat,cet等,但不保活cbt等。
    在方括号里,^放在字首表示是取反。也就是不在方括号里的任一字符。c[^aeiou]t,可表示cbe,但不保活cat.
    方括号表达式可以包括字符的范围,[1--9],[a--f]
    排序是指给予成组的项目排列顺序的操作
    等价字符集用来让不同字符在匹配时视为相同字符。
    字符集,它表示字符的类别,例如数字,小写与大写字母,标点符号,空白等,这些类别名称定义于[:与:]之间
    在方括号表示式中,所有其他的meta字符都会失去其特殊含义,所以[*\.]匹配于字面上的星号,反斜杠以及句号,要让]进入该集合,可以将它放在列表的最前面,[]*\.], 将]增加至此列表中,要让减号字符进入该集合,也请将它放到列表的最前端[-*\.],若你需要右方括号与减号两者进入列表,将右括号放在第一个字符,减号放到最后一个字符[]*\.-]
    NULL字符(数值的零)不需要是可匹配的。
    向后引用
    向后引用的机制指的是匹配于正则表达式匹配的先前的部分。使用向后引用的步骤有两个,第一步是将子表达式包围在\(与\)里。单个模式里可包括至多9个子表达式,且可为嵌套结构
    digit指的是介于1到9的数字
    单个表达式匹配多个字符
    匹配多个字符最简单的方法就是把他们一个接一个连接列出来,所以正则表达式ab匹配ab
    两个点号(..)匹配任一两个字符[:upper:][:lower:]则匹配于任意一个大写字符,后面接着任意一个小写字符。
    修饰符(*)表示匹配0个或多个前面的单个字符,ab&c可以表示ac,abc,abbc 0个或多个b
    区间表达式,可以表明需要匹配的次数
    \{n\} 前置正则表达式所得结果出现n次
    \{n,\} 前置正则表达式所得的结果重现至少n次
    \{n,m\}前置正则表达式所得的结果重现n至m次
    文本匹配锚点
    脱字符号(^)与货币符号($)叫做锚点,其用途在限制正则表达式匹配时,针对要被匹配字符串的开始或结尾处进行匹配。(^在此处的用法与方括号表达式里的完全不同)
    ^用于字符串开始匹配,&用于字符串结尾处进行匹配。
    ^与$可同时使用,这种情况是将括起来的正则表达式匹配整个字符串。
    ^$用来匹配空的字符串或行列
    BRE 基本正则表达式
    ERE 扩展正则表达式
    ERE有另两个meata字符
    匹配单个正则表达式与多个正则表达式
    ? 匹配于0个或一个前置正则表达式 ab?c, ac,abc
    + 匹配于1个或多个前置正则表达式,ab+c,, abc,abbc,abbbc
    交替
    交替运算符,即垂直的一条线,称为管道字符| read|write匹配于read与write两者。
    分组
    在ERE里,运算符是被应用到前置的正则表达式。
    正则表达式的扩展
    \<与\>运算符,分别匹配单词的开头和结尾

  • Shell-Shell入门

    2015-01-03 20:52:33

    脚本编程语言与编译型语言的差异
    编译形语言写成的程序只要从源代码转换成目标代码便能直接通过计算机来执行。
    编译型语言的好处是高效,缺点是他们多半运作与底层,所处理的是字节,整数,浮点数或是其他机器层级的对象。
    脚本编程语言通常是解释型的,这类程序的执行,是有解释器读入程序代码,并将其转换成内部的形式,再执行,解释器本身是一般的编译型程序。使用脚本编程语言的好处是他们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象,缺点是,他们的效率通常不如编译型语言。
    为什么使用shell脚本 
    简单性,Shell是一个高级语言,通过它,你可以简洁地表达复杂的操作
    可移植性,使用POSIX所定义的功能,可以做到脚本无须修改就可以在不同的系统上执行
    开发容易,可以在短时间内完成一个功能强大又好用的脚本。
    who  查看现在系统有谁登陆
    wc程序,字数计算程序,它可以算出行数,字数与字符数,
    |管道符号可以在两程序之间建立管道,
    Who的输出,成了wc的输入,wc所列出的结果就是已登陆用户的个数。
    who | wc -l
    下一步就是将此管道转变成一个独立的命令,方法是把这条命令输入一个一般的文件中,然后使用chmod为该文件设置执行的权限。
    小型shell脚本典型开发周期,
    首先,直接在命令行上测试,
    然后,一旦找到能够完成工作的适当语法,
    再将它放进一个独立的脚本里,并为该脚本设置执行的权限,
    之后,就能直接使用该脚本。
    当shell执行一个程序时,会要求UNIX内核启动一个新的进程,以便在该进程里执行所指定的程序。当Shell要求内核执行它时,内核将无法做这件事,并回应not executable format file的错误信息,Shell收到此错误信息时,会启动一个新的/bin/sh(标准shell)副本来执行该程序。
    如果UNIX系统有多个Shell,如何告知UNIX内核应该以哪个Shell来执行所指定的Shell脚本?
    通过脚本文件中特殊的第一行来处理,在第一行的开头处使用#!这个字符。当一个文件中开头的两个字符是#!时,内核会扫描该行其余的部分,看是否存在可用来执行程序的解释器的完整路径。中间出现任何空白符号都会略过。此外,内核还会扫描是否有一个选项要传递给解释器,内核会以被指定的选项来引用解释器,再搭配命令行的其他部分。Shell脚本通常一开始都是#! /bin/sh
    对#!这一行的长度尽量不要超过64个字符
    脚本是否具有可移植性取决于是否有完整的路径名称
    别在选项后面放任何空白,因为空白也会跟着选项一起传递给被引用的程序
    你需要知道解释器的完整路径名称

    UNIX命令行的原理
    1 格式简单,以空白(space键或Tab键)隔开命令行中各个组成部分
    2 命令名称是命令行的第一个项目通常后面会跟着选项,任何额外的参数都会放在选项后面
    3 选项的开头是一个破折号(或减号),后面接着一个字母,选项是可有可无的,有可能需要加上参数,不需要参数的选项可以合并,选项有短选项和长选项 
    4 分号(;)用来分隔同一行里的多条命令,Shell会依次执行这些命令。如果使用的是&符号而不是分号,则Shell将在后台执行其前面的命令,意味着Shell不用等到该命令完成,就可以继续执行下一个命令。

    Shell识别三种基本命令,内建命令,Shell函数以及外部命令
    1内建命令就是由Shell本身所执行的命令。有些命令是由于其必要性才内建的,有一些内建命令是为了效率
    2 Shell函数是功能健全的一系列程序代码,以Shell语言写成,他们可以像命令那样引用。
    3 外部命令就是Shell的副本(新的进程)=所执行的命令,基本的过程如下:
      1 建立一个新的进程,此进程即为Shell的一个副本
      2 在新的进程里,在PATH变量内所列出的目录中,寻找特定的命令,当命令名称中含有斜杠/符号时,将略过路径查找步骤
      3 在新的进程里,以所找到的新程序取代执行中的Shell程序并执行
      4 程序完成后,最初的Shell会接着从终端读取的下一条命令,或执行脚本里的下一条命令。
    Shell变量赋值的方式为,先写变量名称,紧接着=字符,最后是新值,中间没有空格,当想取出Shell变量的值时,在变量名称前面加上$字符,当所赋予的值内含空格时,请加上引号。单行可进行多次赋值。
    当变量作为第二个变量的新值时,不需要使用双引号,但是用双引号也没有关系。但是当你将几个变量连接起来时,必须使用双引号。
    echo 的任务就是产生输出,可用来提示用户,或是用来产生数据供进一步处理,原始的echo命令只会将参数打印到标准输出,参数之间以一个空格隔开,并以换行符好结尾。
    printf 命令可以输出简单的字符串,printf不像echo那样会自动提供一个换行符,必须显式地将换行符执行为\n

    程序应该有数据的来源端,数据的目的端,以及报告问题的地方,他们分别被称为标准输入,标准输出以及标准错误输出。许多UNIX程序默认情况下会读取标准输入,写入标准输出,并将错误信息传递到标准错误输出,这类程序叫做过滤器。
    在你登录时,UNIX便将默认的标准输入,输出及错误输出安排成你的终端,
    IO重定向就是你通过与终端交互,或是在Shell脚本里设置,重新安排从哪里输入或输出到哪里。

    重定向与管道
    1 以<改变标准输入
    2 以>改变标准输出  >重定向符在目的文件不存在时,会新建一个,然而,如果目的文件已存在,他就会被覆盖掉,原本的数据都会丢失。
    3 以>>附加到文件 如同>,如果目的文件不存在,>>重定向符就会新建一个,然而,如果目的文件存在,它就不会直接覆盖掉文件,而是将程序所产生的数据附加到文件结尾处。
    4 以 |建立管道。管道可以把两个以上执行中的程序衔接在一起,第一个程序的标准输出可以变为第二个程序的标准输入,管道可以使得执行速度比使用临时文件的程序快上十倍,构造管道时,应该试着让每个阶段的数据量变得更少,如果有两个要完成的步骤与先后次序无关,可以让数据变少的那一个步骤放在管道的前面,这样可以提升脚本的整体性能,因为Unix只需要在两个程序间移动少的数据量。
    特殊文件 
    /dev/null ,也叫位桶,传送到此文件的数据都会被系统丢掉,当程序将数据写到此文件时,会认为它已经成功完成写入数据的操作,但实际上什么也没有做。读取/dev/null会立即返回文件结束符号。
    /dev/tty,当程序打开此文件时,UNIX会自动将它重定向到一个终端再与程序结合在程序必须读取人工输入时特别有用,用它来产生错误信息也很方便
    $PATH是一个以冒号分隔的目录列表,你可以在列表所指定的目录下找到所要执行的命令,所找到的命令可能是变异后的可执行文件,也可能是Shell脚本。
    可以建立自己的bin目录并驾到$PATH中,要让修改永久生效,在.profile文件中把bin目录加入$PATH,每次登陆时Shell都会读取.profile文件
    $PATH里的空项目表示当前目录,空项目位于路径值中间时,可以用两个连续的冒号来表示,如果将冒号直接置于最前端或最后段,可以表示查找时最先查找或最后查找当前目录。
    位置参数指的就是Shell脚本的命令行参数。他们同时也可以是函数的参数,各参数都有整数来命名。
    执行跟踪, 用set -x 命令将执行跟踪的功能打开,用set +x命令关闭它
  • Shell-设计与开发软件工具的原则

    2015-01-02 20:59:38

    设计与开发软件工具的原则,好的软件工具应该具备下列特点
    1 一次做好一件事
    2 处理文本行,不要处理二进制数据
    3 使用正则表达式
    4默认使用标准输入/输出
    5 避免喋喋不休
    6 输出格式必须与可接受的输入格式一致
    7让工具去做困难的部分
    8 构建特定工具前,先想想
Open Toolbar