红联Linux门户
Linux帮助

Linux文件内容查询命令

发布时间:2006-03-17 11:14:26来源:红联作者:火
   grep、fgrep和egrep命令

   这组命令以指定模式搜索文件,并通知用户在什么文件中搜索到与指定的模式匹配的字符串,并打印出所有包含该字符串的文本行,在该文本行的最前面是该行所在的文件名。grep命令一次只能搜索一个指定的模式;egrep命令检索扩展的正则表达式(包括表达式组和可选项);fgrep命令检索固定字符串,它不识别正则表达式,是快速搜索命令。

   这组命令在搜索与定位文件中特定的主题方面非常有用。要搜索的模式可以被认为是一些关键词,您可以用它们来搜索文件中包含的这些关键词。编写程序时,可以用它来寻找某一个函数,或是相关的词组。grep命令的搜索功能比fgrep强大,因为grep命令的搜索模式可以是正则表达式,而fgrep却不能。有关正则表达式请参见shell一章。

   该组命令中的每一个命令都有一组选项,利用这些选项可以改变其输出方式。例如,可以在搜索到的文本行上加入行号,或者只输出文本行的行号,或者输出所有与搜索模式不匹配的文本行,或只简单地输出已搜索到指定模式的文件名,并且可以指定在查找模式时忽略大小写。

   这组命令在指定的输入文件中查找与模式匹配的行。如果没有指定文件,则从标准输入中读取。正常情况下,每个匹配的行被显示到标准输出。如果要查找的文件是多个,则在每一行输出之前加上文件名。

   语法:

   grep [选项] [查找模式] [文件名1,文件名2,……]

   egrep [选项] [查找模式] [文件名1,文件名2,……]

   fgrep [选项] [查找模式] [文件名1,文件名2,……]

   这组命令各选项的含义为:

   - E 每个模式作为一个扩展的正则表达式对待。

   - F 每个模式作为一组固定字符串对待(以新行分隔),而不作为正则表达式。

   - b在输出的每一行前显示包含匹配字符串的行在文件中的字节偏移量。

   - c 只显示匹配行的数量。

   - i 比较时不区分大小写。

   - h 在查找多个文件时,指示grep不要将文件名加入到输出之前。

   - l 显示首次匹配串所在的文件名并用换行符将其隔开。当在某文件中多次出现匹配串时,不重复显示此文件名。

   - n 在输出前加上匹配串所在行的行号(文件首行行号为1)。

   - v 只显示不包含匹配串的行。

   - x 只显示整行严格匹配的行。

   - e expression 指定检索使用的模式。用于防止以“-”开头的模式被解释为命令选项。

   - f expfile 从expfile文件中获取要搜索的模式,一个模式占一行。

   对该组命令的使用还需注意以下方面:

   在命令后键入搜索的模式,再键入要搜索的文件。其中,文件名列表中也可以使用特殊字符,如“*”等,用来生成文件名列表。如果想在搜索的模式中包含有空格的字符串,可以用单引号把要搜索的模式括起来,用来表明搜索的模式是由包含空格的字符串组成。否则,Shell将把空格认为是命令行参数的定界符,而grep命令将把搜索模式中的单词解释为文件名列表中的一部分。在下面的例子中,grep命令在文件example中搜索模式“text file”。

   $ grep 'text file' example

    用户可以在命令行上用Shell特殊字符来生成将要搜索的文件名列表。在下面的例子中,特殊字符“*”用来生成一个文件名列表,该列表包含当前目录下所有的文件。该命令将搜索出当前目录下所有文件中与模式匹配的行。

   $ grep data *

    特殊字符在搜索一组指定的文件时非常有用。例如,如果想搜索所有的C程序源文件中特定的模式,您可以用“*.c”来指定文件名列表。假设用户的 C程序中包含一些不必要的转向语句(goto语句),想要找到这些语句,可以用如下的命令来搜索并显示所有包含goto语句的代码行:

   $ grep goto *.c

   用户可以在命令行上键入搜索模式,也可以使用-f选项从指定文件中读取要搜索的模式。在文件中,每个搜索模式占一行。如果经常要搜索一组常见字符串时,这个功能非常有用。在下面的例子中,用户要在文件exam中搜索字符串“editor”和“create”,就把要搜索的模式放置在文件mypats中,然后,grep命令从文件mypats中读取要搜索的模式。

   $ cat mypats

   editor

   create

   $ grep -f mypats exam

   文件查找命令

   find命令

   功能:在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的查找条件,功能很强大。

   语法:find 起始目录 寻找条件 操作

   说明:find命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足寻找条件的文件并对之采取相关的操作。

   该命令提供的寻找条件可以是一个用逻辑运算符not、and、or组成的复合条件。逻辑运算符and、or、not的含义为:

   (1)and:逻辑与,在命令中用“-a”表示,是系统缺省的选项,表示只有当所给的条件都满足时,寻找条件才算满足。例如:

   $ find -name 'tmp' -xtype c -user 'inin'

   该命令寻找三个给定条件都满足的所有文件。

   (2)or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足时,寻找条件就算满足。例如:

   $ find -name 'tmp' -o -name 'mina*'

   该命令查询文件名为'tmp'或是匹配'mina*'的所有文件。

   (3)not:逻辑非,在命令中用“!”表示。该运算符表示查找不满足所给条件的文件。例如:

   $ find ! -name 'tmp'

   该命令查询文件名不是'tmp'的所有文件。

   需要说明的是:当使用很多的逻辑选项时,可以用括号把这些选项括起来。为了避免Shell本身对括号引起误解,在话号前需要加转义字符“”来去除括号的意义。

   例:$ find (-name 'tmp' -xtype c -user 'inin' )

   寻找条件有以下选项:

   首先,下列各个选项中的n值可以有三种输入方式,假设n为20,则:

   +20 表示20以后(21,22,23等)

   -20 表示20以前(19,18,17等)

   20 表示正好是20

   1. 以名称和文件属性查找。

   - name '字串' 查找文件名匹配所给字串的所有文件,字串内可用通配符*、?、[ ]。

   - lname '字串' 查找文件名匹配所给字串的所有符号链接文件,字串内可用通配符*、?、[ ]。

   -gid n 查找属于ID号为n的用户组的所有文件。

   -uid n 查找属于ID号为n的用户的所有文件。

   -group '字串' 查找属于用户组名为所给字串的所有的文件。

   -user '字串' 查找属于用户名为所给字串的所有的文件。

   -empty 查找大小为0的目录或文件。

   -path '字串' 查找路径名匹配所给字串的所有文件,字串内可用通配符*、?、[ ]。

   -perm 权限 查找具有指定权限的文件和目录,权限的表示可以如711,644。

   -size n[bckw] 查找指定文件大小的文件,n后面的字符表示单位,缺省为b,代表512字节的块。

   -type x 查找类型为x的文件,x为下列字符之一:

   b 块设备文件

   c 字符设备文件

   d 目录文件

   p 命名管道(FIFO)

   f 普通文件

   l 符号链接文件(symbolic links)

   s socket文件

   -xtype x 与-type基本相同,但只查找符号链接文件。

   2. 以时间为条件查找

   - amin n 查找n分钟以前被访问过的所有文件。

   - atime n 查找n天以前被访问过的所有文件。

   - cmin n 查找n分钟以前文件状态被修改过的所有文件。

   - ctime n 查找n天以前文件状态被修改过的所有文件。

   - mmin n 查找n分钟以前文件内容被修改过的所有文件。

   - mtime n 查找n天以前文件内容被修改过的所有文件。

   3. 可执行的操作

   - exec 命令名称 {} 对符合条件的文件执行所给的Linux 命令,而不询问用户是否需要执行该命令。{}表示命令的参数即为所找到的文件;命令的末尾必须以“ ;”结束。

   - ok 命令名称 { } 对符合条件的文件执行所给的Linux 命令,与exec不同的是,它会询问用户是否需要执行该命令。

   - ls 详细列出所找到的所有文件。

   - fprintf 文件名 将找到的文件名写入指定文件。

   - print 在标准输出设备上显示查找出的文件名。

   - printf 格式 格式的写法请参考有关C语言的书。

   例1:查找当前目录中所有以main开头的文件,并显示这些文件的内容。

   $ find . - name ‘main*' - exec more {} ;

   例2:删除当前目录下所有一周之内没有被访问过的a .out或*.o文件。

   $ find . (- name a.out - o - name ‘*.o')

   > - atime +7 - exec rm {} ;

   说明如下:

   命令中的“.”表示当前目录,此时find将从当前目录开始,逐个在其子目录中查找满足后面指定条件的文件。(和)表示括号(),其中的“”称为转义符。之所以这样写是由于对Shell而言,(和)另有不同的含义,而不是这里的用于组合条件的用途。“- name a.out”是指要查找名为a.out的文件;“- name ‘*.o'”是指要查找所有名字以 .o结尾的文件。这两个- name之间的- o表示逻辑或(or),即查找名字为a.out或名字以 .o结尾的文件,find在当前目录及其子目录下找到这佯的文件之后,再进行判断,看其最后访问时间是否在7天以前(条件-atime +7),若是,则对该文件执行命令rm(- exec rm{ };)。其中{ }代表当前查到的符合条件的文件名,;则是语法所要求的。上述命令中第一行的最后一个是续行符。当命令太长而在一行写不下时,可输入一个,之后系统将显示一个>,指示用户继续输入命令。

   locate命令

   locate命令用于查找文件,它比find命令的搜索速度快,它需要一个数据库,这个数据库由每天的例行工作(crontab)程序来建立。当我们建立好这个数据库后,就可以方便地来搜寻所需文件了。

   该命令的一般形式为:

   locate 相关字

   例如:查找相关字issue

   $ locate issue

   /etc/issue

   /etc/issue.net

   /usr/man/man5/issue.5

   /usr/man/man5/issue.net.5


   第十课(三) 文本处理命令              

   Sort命令

   sort命令的功能是对文件中的各行进行排序。sort命令有许多非常实用的选项,这些选项最初是用来对数据库格式的文件内容进行各种排序操作的。实际上,sort命令可以被认为是一个非常强大的数据管理工具,用来管理内容类似数据库记录的文件。

   Sort命令将逐行对文件中的内容进行排序,如果两行的首字符相同,该命令将继续比较这两行的下一字符,如果还相同,将继续进行比较。

   语法:

   sort [选项] 文件

   说明:sort命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用“- ”,则表示排序内容来自标准输入。

   sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关键字定义了用来排序的最小的字符序列。缺省情况下以整行为关键字按ASCII字符顺序进行排序。

   改变缺省设置的选项主要有:

   - m 若给定文件已排好序,合并文件。

   - c 检查给定文件是否已排好序,如果它们没有都排好序,则打印一个出错信息,并以状态值1退出。

   - u 对排序后认为相同的行只留其中一行。

   - o 输出文件 将排序输出写到输出文件中而不是标准输出,如果输出文件是输入文件之一,sort先将该文件的内容写入一个临时文件,然后再排序和写输出结果。

   改变缺省排序规则的选项主要有:

   - d 按字典顺序排序,比较时仅字母、数字、空格和制表符有意义。

   - f 将小写字母与大写字母同等对待。

   - I 忽略非打印字符。

   - M 作为月份比较:“JAN”<“FEB”
   - r 按逆序输出排序结果。

   +posl - pos2 指定一个或几个字段作为排序关键字,字段位置从posl开始,到pos2为止(包括posl,不包括pos2)。如不指定pos2,则关键字为从posl到行尾。字段和字符的位置从0开始。

   - b 在每行中寻找排序关键字时忽略前导的空白(空格和制表符)。

   - t separator 指定字符separator作为字段分隔符。

   下面通过几个例子来讲述sort的使用。


   用sort命令对text文件中各行排序后输出其结果。请注意,在原文件的第二、三行上的第一个单词完全相同,该命令将从它们的第二个单词vegetables与fruit的首字符处继续进行比较。

   $ cat text

   vegetable soup

   fresh vegetables

   fresh fruit

   lowfat milk

   $ sort text

   fresh fruit

   fresh vegetables

   lowfat milk

   vegetable soup

   用户可以保存排序后的文件内容,或把排序后的文件内容输出至打印机。下例中用户把排序后的文件内容保存到名为result的文件中。

   $ sort text>result


   以第2个字段作为排序关键字对文件example的内容进行排序。

   $ sort +1-2 example


   对于file1和file2文件内容反向排序,结果放在outfile中,利用第2个字段的第一个字符作为排序关键字。

   $ sort -r -o outfile +1.0 -1.1 example


   sort排序常用于在管道中与其他命令连用,组合完成比较复杂的功能,如利用管道将当前工作目录中的文件送给sort进行排序,排序关键字是第6个至第8个字段。

   $ ls - l | sort +5 - 7

   sort命令也可以对标准输入进行操作。例如,如果您想把几个文件文本行合并,并对合并后的文本行进行排序,您可以首先用命令cat把多个文件合并,然后用管道操作把合并后的文本行输入给命令sort,sort命令将输出这些合并及排序后的文本行。在下面的例子中,文件veglist与文件fruitlist的文本行经过合并与排序后被保存到文件clist中。

   $ cat veglist fruitlist | sort > clist


   uniq命令

   文件经过处理后在它的输出文件中可能会出现重复的行。例如,使用cat命令将两个文件合并后,再使用sort命令进行排序,就可能出现重复行。这时可以使用uniq命令将这些重复行从输出文件中删除,只留下每条记录的唯一样本。

   语法:uniq [选项] 文件

   说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如果输入文件用“- ”表示,则从标准输入读取。

   该命令各选项含义如下:、

   - c 显示输出中,在每行行首加上本行在文件中出现的次数。它可取代- u和- d选项。

   - d 只显示重复行。

   - u 只显示文件中不重复的各行。

   - n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。

   +n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。

   - f n 与- n相同,这里n是字段数。

   - s n 与+n相同,这里n是字符数。

   例如:

   1. 显示文件example中不重复的行。

   uniq - u example

   2. 显示文件example中不重复的行,从第2个字段的第2个字符开始做比较。

   uniq - u - 1 +1 example

本文由TurboLinux公司提供
文章评论

共有 19 条评论

  1. 201.221.20.* 于 2007-08-15 06:21:42发表:

    32a6454c94c1871f57d133f933604248 Independent newsletter from our foreign friends points our attention to your web project. We are very proud to communicate and colaborate with such partner. Don't be surprised of being noticed. d71cfb75399e2ac16322082f9e4e5929

  2. 200.158.80.* 于 2007-07-18 17:52:50发表:

    http://b1e91ba2c248828e4970c9f17f1709a7-t.xkktxb.org b1e91ba2c248828e4970c9f17f1709a7 http://b1e91ba2c248828e4970c9f17f1709a7-b1.xkktxb.org b1e91ba2c248828e4970c9f17f1709a7 http://b1e91ba2c248828e4970c9f17f1709a7-b3.xkktxb.org 8d1f2bfe3cbc5359328d95464cab8b7c

  3. 24.202.139.* 于 2007-07-06 00:42:07发表:

    http://998a810fb9b4022e1c2a01c69f2962fe-t.lwgmrw.org 998a810fb9b4022e1c2a01c69f2962fe http://998a810fb9b4022e1c2a01c69f2962fe-b1.lwgmrw.org 998a810fb9b4022e1c2a01c69f2962fe http://998a810fb9b4022e1c2a01c69f2962fe-b3.lwgmrw.org 7323937625928ec2c2b389a5c949efe8

  4. wide 于 2006-07-13 22:31:25发表:

    学习了,很详细

  5. shen167 于 2006-07-01 08:59:32发表:

    好!!!!!!!!!!!顶

  6. MOSSC 于 2006-06-16 08:01:25发表:

    受益