Linux应用技巧.docx

上传人:b****5 文档编号:3611111 上传时间:2022-11-24 格式:DOCX 页数:52 大小:72.89KB
下载 相关 举报
Linux应用技巧.docx_第1页
第1页 / 共52页
Linux应用技巧.docx_第2页
第2页 / 共52页
Linux应用技巧.docx_第3页
第3页 / 共52页
Linux应用技巧.docx_第4页
第4页 / 共52页
Linux应用技巧.docx_第5页
第5页 / 共52页
点击查看更多>>
下载资源
资源描述

Linux应用技巧.docx

《Linux应用技巧.docx》由会员分享,可在线阅读,更多相关《Linux应用技巧.docx(52页珍藏版)》请在冰豆网上搜索。

Linux应用技巧.docx

Linux应用技巧

Linux应用技巧

1用uniq除去重复行

重复行通常不会造成问题,但是有时候它们的确会引起问题。

此时,不必花上一个下午的时间来为它们编制过滤器,uniq命令便是唾手可得的好工具。

了解一下它是如何节省您的时间和精力的。

进行排序之后,您会发现有些行是重复的。

有时候该重复信息是不需要的,可以将它除去以节省磁盘空间。

不必对文本行进行排序,但是您应当记住uniq在读取行时会对它们进行比较并将只除去两个或更多的连续行。

下面的示例说明了它实际上是如何工作的:

清单1.用uniq除去重复行

$cathappybirthday.txt

HappyBirthdaytoYou!

HappyBirthdaytoYou!

HappyBirthdayDearTux!

HappyBirthdaytoYou!

 

$sorthappybirthday.txt

HappyBirthdayDearTux!

HappyBirthdaytoYou!

HappyBirthdaytoYou!

HappyBirthdaytoYou!

 

$sorthappybirthday.txt|uniq

HappyBirthdayDearTux!

HappyBirthdaytoYou!

警告:

请不要使用uniq或任何其它工具从包含财务或其它重要数据的文件中除去重复行。

在这种情况下,重复行几乎总是表示同一金额的另一个交易,将它除去会给会计部造成许多困难。

千万别这么干!

有关uniq的更多信息

本系列文章介绍了文本实用程序,它对在手册页和信息页找到的信息作了补充。

如果您打开新的终端窗口并输入manuniq或infouniq,或者打开新的浏览器窗口并查看位于gnu.org的uniq手册页,那么就可以了解更多的相关信息。

如果您希望您的工作轻松点,比如只显示唯一的或重复的行,那么该怎么办呢?

您可以用-u(唯一)和-d(重复)选项来做到这一点,例如:

清单2.使用-u和-d选项

$sorthappybirthday.txt|uniq-u

HappyBirthdayDearTux!

 

$sorthappybirthday.txt|uniq-d

HappyBirthdaytoYou!

您还可以用-c选项从uniq中获取一些统计信息:

清单3.使用-c选项

$sorthappybirthday.txt|uniq-uc

1HappyBirthdayDearTux!

 

$sorthappybirthday.txt|uniq-dc

3HappyBirthdaytoYou!

就算uniq对完整的行进行比较,它仍然会很有用,但是那并非该命令的全部功能。

特别方便的是:

使用-f选项,后面跟着要跳过的字段数,它能够跳过给定数目的字段。

当您查看系统日志时这非常有用。

通常,某些项要被复制许多次,这使得查看日志很难。

使用简单的uniq无法完成任务,因为每一项都以不同的时间戳记开头。

但是如果您告诉它跳过所有的时间字段,您的日志一下子就会变得更加便于管理。

试一试uniq-f3/var/log/messages,亲眼看看。

还有另一个选项-s,它的功能就像-f一样,但是跳过给定数目的字符。

您可以一起使用-f和-s。

uniq先跳过字段,再跳过字符。

如果您只想使用一些预先设置的字符进行比较,那么该怎么办呢?

试试看-w选项。

有什么问题或意见吗?

我非常乐意收到您的来信-请发送邮件到jacek@。

下一次,我们将研究nl。

到时候见!

2用tr过滤文件

没有人曾说过sed很容易—它确实不容易!

但通过使用tr,您可以非常容易地实现sed的许多最基本功能。

JacekArtymiak向您展示如何去做。

您可以将tr看作为sed的(极其)简化的变体:

它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。

您也可以用它来除去重复字符。

这就是所有tr所能够做的。

那么,为什么要使用tr,而不使用sed呢?

当然是为了使事情简单。

例如,如果我们希望用字母“z”来替换出现的所有字母“a”,则可以用traz,这条命令毫无疑问比sed-es/a/z/g简单,尤其在把它用到脚本中时,其中的引号转义很让人头痛。

另外,在使用tr时,可以避免写那些让人讨厌的正则表达式。

使用tr很简单:

使用前面一段中所给出的符号表示法,用一个字符去替换出现的所有另一个字符。

当需要替换多个字符时,使用类似于这样的表示法:

trabcxyz,它表示用字母“x”去替换出现的所有字母“a”,用字母“y”去替换所有字母“b”,用字母“z”去替换所有字母“c”。

这两组中所列出的字符的数目不必相等。

您也可以指定字符的范围。

例如,tra-zA-Z将用对应的大写字母来替换所有的小写字母(例如,它将“nosmoking”转换成“NOSMOKING”)。

当您在vi编辑器中想强调正在编辑的文本的某一部分时,使用这一特殊技巧非常方便。

只要按一下Escape键,然后按:

键,再输入2,4!

tr'a-z''A-Z',最后按一下Return键。

现在,从第2行到第4行的字母就都转换成了大写字母。

关于tr的其它内容

GNU手册上提到,tr在执行您所选择的操作时,通过将标准输入复制到标准输出,从而实现“转换、压缩和/或删除字符”。

在这篇技巧文章中,您将了解到这些选项;当然也可以通过了解tr的手册页或信息页,学习到更多关于tr的内容。

打开一个新的终端窗口,输入mantr或infotr—或者打开一个新的浏览器窗口,并链接到gnu.org上的tr手册页(关于这个链接,请参阅参考资料)。

另外,当有人给您发送了一个在MacOS或DOS/Windows机器上创建的文本文件时,您会发现tr非常有用。

如果没有将文件保存为使用UNIX换行符来表示行结束这种格式,则需要将这样的文件转换成本机UNIX格式,否则一些命令实用程序不会正确地处理这些文件。

MacOS的行尾以回车字符结束,许多文本处理工具将这样的文件作为一行来处理。

为了纠正这个问题,可以用下列技巧:

∙Mac->UNIX:

tr'\r''\n'unixfile

∙UNIX->Mac:

tr'\n''\r'macfile

MicrosoftDOS/Windows约定,文本的每行以回车字符并后跟换行符结束。

为了纠正这个问题,可以使用下列命令:

∙DOS->UNIX:

tr-d'\r'unixfile

∙UNIX->DOS:

在这种情况下,需要用awk,因为tr不能插入两个字符来替换一个字符。

要使用的awk命令为awk'{print$0"\r"}'dosfile

另外,当您需要对文本文件做一些简单的整理工作(如用tr-d'\t'除去制表符,用tr-s''除去多余的空格,或者用tr-d'\n'将分开的几行合成一行)时,会需要用tr。

同样,可以在vi内使用所有这些命令;只要记住:

在tr命令前要加上您希望处理的行范围和感叹号(!

),如1,$!

tr-d'\t'(美元符号表示最后一行)中所示。

3用cat合并文件

在我们有关GNU文本实用程序的连续系列中,JacekArtymiak对cat做了一下研究—cat这个命令是UNIX爱好者所热爱的,也是厌恶UNIX的人所憎恶的。

您常常需要将几个文件处理成一个文件并将这种处理的结果保存到一个单独的输出文件。

cat(“concatenate”的缩写)命令在其输入上接受一个或多个文件并将它们作为一个单独的文件打印到它的输出。

例如,catchapter01chapter02chapter03>book将三个chapterXX文件保存在一个单独的book文件中。

输入文件按照它们在cat命令后的排列顺序被打印,因此,要调换信息的顺序,就必须先调换输入文件的顺序。

此外,当需要处理的文件数目对于您来说过大而无法手工输入这些文件的名称时,您可以使用通配符,如在catchapter*>book中使用的那样,记住,文件名将会按升序排列。

当您突然发现chapter13被发送到输出中时会在chapter2之前,而会在chapter02之后时,这会引起很有意思的问题。

当cat的输出没有被重定向到一个文件或另一个命令的标准输出时,cat表现出来的行为与多数命令行工具一样,即将其输出发送到控制台。

这意味着您可以使用cat来显示文件;例如,您可以使用cat/etc/passwd来显示系统密码文件的内容。

为方便起见,您应该用less查看大文件,如在less/etc/passwd中那样(您可以通过输入manless学习更多关于less的知识)。

尽管cat主要用于合并文件,您还可以将它用于输入的简单自动处理。

例如,您可以使用一个单独的空白行来除去多行空白行(使用-s选项),这是一个在您将源代码公诸于世前进行清除工作的好办法。

遗憾的是,cat并没有用于一次清除所有空白行的选项。

但这并不是什么大问题,因为您可以使用方便的sed命令将这些空白行除去:

清单1.使用sed与cat除去空白行

$cat-s/etc/X11/XF86Config|sed'/^[[:

space:

]]*$/d'

...

#MultipleFontPathentriesareallowed(theyareconcatenatedtogether)

#Bydefault,RedHat6.0andlaternowuseafontserverindependentof

#theXservertorenderfonts.

FontPath"/usr/X11R6/lib/X11/fonts/TrueType"

FontPath"unix/:

7100"

EndSection

...

对于读取配置文件和HTML页面的源文件,特别是那些由脚本生成的插入了不必要新行的源文件,以及那些包含大型条件结构(其各个项之间已经用空行分开)的源文件来说,空白行紧缩是一个方便的技巧。

cat的另外一个重要的功能是它可以对行进行编号。

这种功能对于程序文档的编制以及法律和科学文档的编制很方便。

打印在左边的行号使得参考文档的某一部分变得容易。

这在编程、科学研究、业务报告或甚至是立法工作中都是非常重要的。

对行进行编号功能有两个选项:

-b选项(只能对非空白行进行编号)和-n选项(可以对所有行进行编号):

清单2.对行进行编号

$cat-b/etc/X11/XF86Config

...

 

14#MultipleFontPathentriesareallowed(theyareconcatenatedtogether)

15#Bydefault,RedHat6.0andlaternowuseafontserverindependentof

16#theXservertorenderfonts.

17FontPath"/usr/X11R6/lib/X11/fonts/TrueType"

18FontPath"unix/:

7100"

19EndSection

...

$cat-n/etc/X11/XF86Config

...

 

20#MultipleFontPathentriesareallowed(theyareconcatenatedtogether)

21#Bydefault,RedHat6.0andlaternowuseafontserverindependentof

22#theXservertorenderfonts.

23

24FontPath"/usr/X11R6/lib/X11/fonts/TrueType"

25FontPath"unix/:

7100"

26

27EndSection

...

cat还可以在您查看包含如制表符这样的非打印字符的文件时起帮助作用。

您可以用以下选项来显示制表符:

∙-T将制表符显示为^I

∙-v显示非打印字符,除了换行符和制表符,它们使用各自效果相当的“控制序列”。

例如,当您处理一个在Windows系统中生成的文件时,这个文件将使用Control-M(^M)来标记行的结束。

对于代码大于127的字符,它们的前面将会被加上M-(表示“meta”),这与其它系统中在字符前面加上Alt-相当。

∙-E在每一行的结束处添加美元符($)。

清单3.显示非打印字符

$cat-t/etc/X11/XF86Config

...

#MultipleFontPathentriesareallowed(theyareconcatenatedtogether)

#Bydefault,RedHat6.0andlaternowuseafontserverindependentof

#theXservertorenderfonts.

 

^IFontPath^I"/usr/X11R6/lib/X11/fonts/TrueType"

^IFontPath^I"unix/:

7100"

EndSection

...

 

$cat-E/etc/X11/XF86Config

...

#MultipleFontPathentriesareallowed(theyareconcatenatedtogether)$

#Bydefault,RedHat6.0andlaternowuseafontserverindependentof$

#theXservertorenderfonts.$

$

FontPath"/usr/X11R6/lib/X11/fonts/TrueType"$

FontPath"unix/:

7100"$

$

EndSection$

...

$cat-v/etc/X11/XF86Config

...

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@M-|M-8^X^@^@^@

P^@^O"M-X^OM-@^M^@^@^@M-^@^O"M-@M-k^@M-8*^@

@M-^H$M-@M-9|A(M-@)M-yM-|M-sM-*M-hW^A^@^@j^@

M-|M-sM-%1M-@M-9^@^B^@^@M-sM-+fM-^A=^@^@

F^@^@^@M-9^@^H^@^@M-sM-$M-G^E(l!

M-@M-^?

^IM-A5^@^@^D^@PM-^]M-^\X1M-H%^@^@^D^@tyM-G

4使用head和tail以块方式读取文本流

Jacek在本技巧文章中介绍了head和tail命令,它们对于以块方式处理静态和动态文件中的数据非常有用。

假定您想只处理文件的一部分,譬如头几行或后几行,那您该怎么做呢?

请使用head(它将头10行发送至标准输出)或tail(它将后10行发送至标准输出)。

您可以通过使用-n选项改变这些命令发送至其标准输出的行数(当然,输出结果将随XF86Config文件的内容而不同):

清单1.将XF86Config中选定行数的内容发送至标准输出

$head-n4/etc/X11/XF86Config

#Filegeneratedbyanaconda.

#**********************************************************************

#RefertotheXF86Config(4/5)manpagefordetailsabouttheformatof

#thisfile.

 

$tail-n4/etc/X11/XF86Config

Modes"1600x1200"

ViewPort00

EndSubsection

EndSection

如果您想让head或tail以字节而不是以行为单位,那该怎么办呢?

您可以用-c选项代替-n选项。

因此,要显示前200个字符,请使用head-c200file,或者使用tail-c200file来显示后200个字符。

如果数字后面跟有b(表示块(block)),那么这个数字将被乘以512。

类似地,跟有k(表示千字节(kilobyte))表示用1024去乘给定的数字,而跟有m(表示兆字节(megabyte))表示用1048576字节去乘给定的数字。

请记住,headfile1file2file3和catfile1file2file3|head之间有重大差别。

前者将打印每个文件指定行数的内容,不同文件的内容之间用头信息隔开,头信息以==>后跟文件名开头。

后者将打印由cat命令后所列文件组成的输入流中指定行数的内容,但将把输入流作为单个文件对待。

可以使用-q(表示静默(quiet))选项关闭文件名头信息。

与-q相反的是-v(表示详列(verbose))。

假如您要处理的文件在处理期间一直在发生变化(比如,当您让head或tail读取来自正在被另一个命令写入的文件的数据时,就是这种情况),请使用-f选项让tail持续读取来自指定文件的数据并将这些数据发送至tail自己的标准输出中。

通过管道发送数据时该选项会被忽略。

因此,catfile|tail-f将不会得到所期望的结果,但tail-ffile则可以。

(如果tail正在读取的文件不止一个,那么各行内容之间将用标准头信息隔开,以指明它们来自哪个文件,标准头信息以==>开头。

这个选项用于监视系统日志再合适不过,譬如,在单独的终端窗口(或单独的控制台)中执行的tail-f/var/log/access.log将持续打印每次点击后新添加的Apache访问日志条目,一直到您用Ctrl-C停止它为止。

通过组合使用head和tail,可以从文件的中间部分读取给定长度的一块数据!

下面说明如何做到:

假定您想从文件开头算起第1000字节处开始读取一块789字节的数据。

可以使用catfile|head-c1788|tail-c789来解决这一问题。

使用tac命令逆序排序文件

如果您想对文件中的各行进行逆序排序,该怎么做呢?

这就要用到tac命令。

(请注意,tac由cat逆序拼写而成。

)该命令对所列出的文件中的各行或各段进行逆序排序。

该命令不能逆序排序各文件的顺序—这个任务您得自己做,以逆向顺序在tac命令后列出各文件即可。

作为说明tac的工作原理的示例,请在您的主目录中对一些文件使用ls-l|tail和ls-l|tail|tac,比较其结果。

5用sort和tsort对文件进行排序

通过使用sort和tsort,而不是采取使用Perl或Awk的较复杂的解决方案,可以节省时间,同时还能避免令人头疼的问题。

JacekArtymiak将向您说明如何做到这一点。

尽管可以用Perl或Awk编写高级排序应用程序,但并非总是有此必要,而且这样的工作也常常令人感到头疼。

使用sort命令,您同样可以实现您所需的大多数功能,而且更容易,它可以对多个文件中的行进行排序、合并文件甚至可以查看是否有必要对它们进行排序。

您可以指定排序键(用于比较的行中的一部分),也可不指定,后一种情况下sort就比较所有行。

因此,如果您想对密码文件进行排序,就可以使用下列命令(请注意,您不能将输出直接发送到输入文件,因为这会破坏输入文件。

这就是为何您需要将它发送到临时文件中,然后将该文件重命名为/etc/passwd的原因,如下所示)。

清单1.简单排序

$su-

#sort/etc/passwd>/etc/passwd-new

#mv/etc/passwd-new/etc/passwd

有关sort和tsort的更多信息

通过打开有关排序操作的GNU手册页来学习手册页中的内容,或者通过在命令行中输入mansort或mantsort在新的终端窗口的手册页或信息页中查看这些选项。

如果您想倒转排序的次序,则应当使用-r选项。

您还可以用-u选项来禁止打印相同的行。

sort的一个非常实用的特性是它用字段键进行排序的能力。

字段是一个文本字符串,通过某个字符与其它字段分隔开。

例如,/etc/passwd中的字段是用冒号(:

)分隔的。

因此,如果愿意的话,您可以按照用户标识、组标识、注释字段、主目录或shell对/etc/passwd进行排序。

要做到这一点,请使用-t选项,其后跟着用作分隔符的字符,接着是用作排序键的字段编号,再跟作为键的最后一个字段的编号;例如,sort-t:

-k5,5/etc/passwd按照注释字段对密码文件进行排序,该字段中存储了完整的用户名(如“JohnSmith”)。

而sort-t:

-k3,4/etc/passwd同时使用用户标识和组标识对同一个文件进行排序。

如果您省略了第二个数字,那么sort会假定键是从给定的字段开始,一直到每一行的末尾。

动手试一试,并观察其中的区别(当数字排序看上去有错时,请添加-g选项)。

还要注意的是,空白过渡是缺省的分隔符,因此,如果字段已经用空白字符分隔了,那么您可以省略分隔符,只使用-t(另注:

字段的编号是从1开始的)。

为了更好地进行控制,您可以使用键和偏移量。

偏移量是用点与键相分隔的,比如在-k1.3,5.7中,表示排序键应当从第1个字段的第3个字符开始,到第5个字段的第7个字符结束(偏移量也是从1开始编号的)。

何时会用得着偏移量呢?

嗯,我时常用它来对Apache日志进行排序;键和偏移量表示法让我跳过了日期字段。

另一个要关注的选项是-b,它告知sort忽略空白字符(空格、跳格等等)并将行中的第一个非空白字符当做是排序键的开始。

还有,如果您使用该选项,那么将从第一个非空白字符开始计算偏移量(当字段分隔符不是空白字符,且字段可能包含以空白字符开头的字符串时,这非常有用)。

可以用下面这些选项来

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1