现在的位置: 首页 > 综合 > 正文

Unix shell 学习系列——工具

2012年11月24日 ⁄ 综合 ⁄ 共 3051字 ⁄ 字号 评论关闭

这是shell学习系列的第一期,将会不断更新。。。

具体的学习书籍:Unix shell 编程(第三版)    下载地址

本节介绍在shell编程中经常用到的一些工具

 

1、Shell工具----正则表达式

关于正则表达式,前面已经有一篇学习笔记描述了大部分常用的应用,文章在这儿

 

2、Shell工具----cut

 

cut命令一般用于从数据文件或者命令的输出中析取出各种各样的数据域,一般格式为:

cut –cchars file

chars指定想从文件的每一行析取那些文字,可以是一个数字,代表每一行的第几个字符:

cut –c5   data取第五个字符

cut –c5,13,51  data取第五、第13和第51个字符

cut –c20-50   data 取第20到第50之间的字符,包括他们自己

cut –c20-  data 取第20个字符到行尾的所有内容,并把结果输出到标准输出

上述示例中的逗号和连字符可以混合使用,达到析取多行字段的目的

 

如果 不指定file参数,将从标准输入读取数据,意味着该命令可以作为管道过滤器

 

cut命令的-d和-f选项

当数据用特定的字符分割时,可以用这两个选项来析取指定的字段,命令格式为:

cat –ddchar –ffields file

dchar用来指定特定分隔符,fields用来指定要析取出的字段的编号(从1开始),可以用逗号和连字号指定多个域,用法和-c选项中的数字指定是相同的

如果上述格式中没有指定分隔符,cut就用制表符作为默认的分隔符

 

小技巧:如果事先不知道字符之间是用制表符还是空格分隔的,可以使用下述命令来观察,如果是用制表符分隔的,它会显式的将制表符输出为\t:

sed –n l filename

 

 

3、shell工具—paste

 

paste用来将多行合在一起,与cut的功能差不多相反,一般格式为:

paste files 

files之间用空格隔开,files指定的所有文件中的对应行形成一行,然后写入标准输出,可以用破折号(-)表示从标准输入获得输入;

 

-d选项

默认情况下,形成一行时,不同文件的行内容之间用制表符分隔,可以用-d选项来指定分隔符,如:paste –d'+' names address。

-s选项

使用-s选项告诉paste将同一文件中的所有行粘到一起,而不是从其他文件,也可以使用-d选项来指定分隔符。

 

 

4、Shell工具-sed

 

Sed(stream editor)意即流编辑器,用来编辑数据,命令格式为:

sed command file

其中command是作用于文件file各行的风格同ed的命令,如果没有指定文件,就把标准输入作为处理对象,命令执行结束后将处理结果写到标准输出(不是在原文件上做修改)。

 

替换的例子:

sed 's/Unix/UNIX/' intro    //将文件intro中的每一行的第一个Unix替换为UNIX

sed 's/Unix/UNIX/g' intro   //通过在s命令的后边加上全局选项g,保证替换一行中的所有串

 

注意,sed工具的command都是用单引号括起来的。

 

-n选项告诉sed除非显式说明,否则不显示任何一行,p命令指定显示那几行

sed –n '1,2p' intro    //只显示前两行

sed –n '/UNIX/p' intro  //显示包含UNIX的行

 

d命令完成删除整行文字的功能

sed '1,2d' intro  //删除第一行和第二行

sed '/UNIX/d' intro //删除包含UNIX的所有行

sed默认把输入的所有行写入到标准输出,故上述命令将删除指定行剩余的其他行都显示

 

其他一些展示sed强大功能的例子:

sed '5d'                                                 //显示第5行

sed '/[Tt]est/d'                        //显示包含Text/text的行

sed –n '20,25p' text                                      //显示第20-25行

sed '1,10s/unix/UNIX/g' intro           //在1-10行中将所有unix替换为UNIX

sed '/jan/s/-1/-5/'                                //将所有包含jan的行中-1替换为-5

sed 's/…//' data                                    //删除每行的前三个字符

sed 's/…$//' data                                 //删除每行结尾的3个字符

sed –n 'l' text                                                  //显示text的所有行,把所有不可打印字符显示为\nn(8进//制值),制表符显示为\t(不太懂?求解释

 

shell工具-------tr

 

tr工具用来转换来自标准输入的单个字符,一般格式为:tr from-chars to-chars

其中from-chars和to-chars是一个或多个字符,转换的结果写到标准输出,原文件保持不变。

 

cut –d: -f1,6 /etc/passwd |tr : '       '

上述命令首先将passwd文件中用“:”分隔的第一个和第六个字段提取出来,然后用tr工具将分隔符冒号替换为制表符

 

-s选项压缩tochars中连续重复出现的字符

-d选项删除来自输入流中的指定字符,此时只有一个参数

fromchars和tochars也可以为多个字符,但字符数目要一样,完成对位的替换,如tr 'a-z' 'A-Z'将所有小写字母转换为大写字母,tr '[A-Z]' '[N-ZA-M]'把A-M替换为N-Z将N-Z替换为A-M

 

 

shell工具-------grep

 

grep命令可以从一个或多个文件中搜索特定的字符串模式,一般格式为:grep pattern files

执行命令后符合模式pattern的字符串的所有行都输出到标准输出,如果给grep指定了多个文件,会在每一行的前面显示文件名,如果在给定的文件中没有符合该模式的字符串,则什么都不输出。如果不指定输入文件,grep将从标准输入获得输入。

 

最好将模式括在一对单引号中,这样可以保护其不受shell的干扰。

 

-i选项指明在匹配模式时忽略字母的大小写,模式可以使用正则表达式。

-v选项输出指定文件中不与模式匹配的所有行

-l选项 使用该选项时,只输出包含指定模式的文件的文件名

-n选项 使用该模式时,不仅输出与模式匹配的行内容,还在每一行前加上该行在文件中的相对行号

 

shell工具------sort

 

默认情况下,sort取出指定文件中的每一行,将他们按升序排序,特殊字符按照它们的内部编码排序。

-u选项:在输出中去除重复的行

-r选项:颠倒排序顺序,即按降序排序

-o选项:如果要将排序结果写入原文件,用输出重定向的话会破坏文件,-o选项完成这项工作

-n选项:表示把行中的第一个字段当作数值,按算术方法进行排序

 

要指定按行中的某个特定字段排序,可以用+dn选项,d代表阿拉伯数字

sort +1n data  //排序时跳过第一个字段,然后按算术方法排序,将1改为5表示跳过前五个字段,字段默认用空格或制表符进行分隔,如果采用的是其他的分隔符,使用-t选项指定

-t选项:t后面跟的字符被当作分隔符

未完待续。。。

抱歉!评论已关闭.