`
paldosfan
  • 浏览: 28505 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

LINUX.grep,find

 
阅读更多
1、grep

功能描述
grep 命令在一个或多个文件中查找与指定模式匹配的字符串。如果模式里包含有空格,必须用引号括起来。grep的模式只能是一个被引号括起来的字符串或者是一个单词,后面紧跟着的参数都被当作文件名。grep命令把结果输出到标准输出上,并不改变被搜索的源文件。

命令格式
grep pattern filename filename2 ...

grep有几个选项比较常用的
-i    查找时忽略大小写进行比较
-n    显示找到的行在文件中的行号
-v    显示不匹配的行

例1:在/etc/passwd文件中查找包含"bugboy"的行
[bugboy@bugboy ~]$ grep bugboy /etc/passwd
bugboy:x:500:500:YanDingcheng:/home/bugboy:/bin/bash

grep在/etc/passwd文件中查找含有bugboy的每一行,如果找到就把该行输出到标准输出上,grep的退出状态
为0;如果没找到,grep将不会输出任何信息,退出状态为1;如果指定的文件不存在,grep的退出状态为2。

grep模式支持正则表达式,下面是一些常用的正则表达式匹配元字符。

^      行起始锚定符,例如'^love',匹配所有以love开始的行。
$     行结束锚定符,例如'love$',匹配所有以love结束的行。
.      匹配任意一个字符, 例如'l..e',匹配所有以"l"开头,紧跟两个字符,然后以"e"结尾的字符串。
*     匹配0个或多个任意字符,例如' *bug',匹配以任意多个空格开始,后跟"bug"的字符串。
[]     匹配字符集中的一个字符,例如'[Bb]ook',匹配Book或book。
[^]   匹配不在字符集中的一个字符,例如'[^A-Z]low',匹配所有不以大写字母开头,后跟"low"的字符串。
/<   单词超始锚定符,例如'/<go',匹配所有以"go"开头的单词。
/>   单词结束锚定符,例如'or/>',匹配所有以"or"结束的单词。
x/{m/}    匹配m个x,例如'o/{5}',匹配5个o,即"ooooo"。
x/{m,/}   匹配至少m个x,例如'o/{5,/},匹配至少5个o,即"ooooo","oooooo"等。
x/{m,n/} 匹配m到n个x,例如'o/{2,5/}',匹配2到5个为,即"oo","ooo","oooo","ooooo"。

例2:在/etc/passwd中查找用户名以"b"开头的用户
[bugboy@bugboy test]$ grep ^b /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
bugboy:x:500:500:YanDingcheng:/home/bugboy:/bin/bash

例3:在/etc/passwd中查找SHELL为bash的用户
[bugboy@bugboy test]$ grep bash$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
ftp:x:14:50:FTP User:/var/ftp:/bin/bash
netdump:x:34:34:Network Crash Dump user:/var/crash:/bin/bash
pvm:x:24:24::/usr/share/pvm3:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
bugboy:x:500:500:YanDingcheng:/home/bugboy:/bin/bash

例3:在/etc/passwd中查找含有"00"的行
[bugboy@bugboy test]$ grep '0/{2/}' /etc/passwd
games:x:12:100:games:/usr/games:/sbin/nologin
bugboy:x:500:500:YanDingcheng:/home/bugboy:/bin/bash

例4:查找sscanf.c文件中的非空行
[bugboy@bugboy test]$ cat sscanf.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    const char *str = "I am bugboy";
    char mystr[256];

    sscanf(str, "%s", mystr);
    printf("1: %s/n", mystr);

    char key[64], value[64];
    sscanf(str, "%s %s", key, value);

    printf("key: %s, value: %s/n", key, value);

    return 0;
}
[bugboy@bugboy test]$ grep -v '^ *$' sscanf.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    const char *str = "I am bugboy";
    char mystr[256];
    sscanf(str, "%s", mystr);
    printf("1: %s/n", mystr);
    char key[64], value[64];
    sscanf(str, "%s %s", key, value);
    printf("key: %s, value: %s/n", key, value);
    return 0;
}

例5:查找sscanf.c文件中含有"const char"的行,注意,如果要查找的字符串不只一个单词,要用引号括起来。
[bugboy@bugboy test]$ grep "const char" sscanf.c
    const char *str = "I am bugboy";
   
2、find

功能描述
find命令在文件系统中查找文件

命令格式
find  [path ...] [option] [-exec | -ok | -print]

find 命令的参数
path    find命令所查找的目录路径。
-exec   find命令对查找到的每一个匹配文件执行一个shell命令,命令格式为 "-exec command {} /;",
        注意“{}”和“/;”之间有一个空格,最后的“;“也不要忘了。
-ok     和-exec的作用相同,只是在执行命令之前请求用户确认,更安全的执行命令。
-print  将查找到的文件输出到标准输出。

例1:查到/tmp目录下所有扩展名为".tmp"的文件并删除。
[bugboy@bugboy test]$ find /tmp -name "*.tmp" -exec rm {} /;
这里用到了一个-name选项,是指按文件名查找,后面我将会对它进行说明。

命令选项
-name      按照文件名查找文件。
-perm       按照文件权限来查找文件。
-user        按照文件属主来查找文件。
-group     按照文件所属的组来查找文件。
-mtime -n +n  按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。
              find命令还有-atime和-ctime选项,它们和-mtime选项类似。
-nogroup   查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser    查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! -newer file2  查找更改时间比文件file1新但比文件file2旧的文件。
-type      查找某一类型的文件,诸如:
    b - 块设备文件。
    d - 目录。
    c - 字符设备文件。
    p - 管道文件。
    l - 符号链接文件。
    f - 普通文件。
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth     在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype    查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,
                该配置文件中包含了本系统中有关文件系统的信息。
-mount     在查找文件时不跨越文件系统mount点。
-follow     如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio        对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。

另外,下面三个的区别:
  -amin  n   查找系统中最后N分钟访问的文件
 -atime n  查找系统中最后n*24小时访问的文件
 -cmin  n  查找系统中最后N分钟被改变文件状态的文件
 -ctime n  查找系统中最后n*24小时被改变文件状态的文件
  -mmin  n  查找系统中最后N分钟被改变文件数据的文件
 -mtime n  查找系统中最后n*24小时被改变文件数据的文件

例2:查找当前目录下的块设备文件
[bugboy@bugboy dev]$ find . -type b
./fd0H720
./fd0H360
./fd0H1440
./fd0D720
这里省略掉了部份结果。

例3:查找当前目录下5天以内修改过的文件
[bugboy@bugboy test]$ find . -mtime -5
.
./toto.s
./toto.c
./tookit
./over
./over.s
./over.c
./tookit.c

例3:查找当前目录下比stat.c文件新,比over.c文件旧的文件
[bugboy@bugboy test]$ find . -newer stat.c ! -newer over.c
./toto.s
./crypt
./test
./toto.c
./strtok
./foo.h
./fstatvfs
./strsep.c

例4:查找当前目录下,具有644(用户可读、写,组可读,其它用户可读)权限的文件
[bugboy@bugboy test]$ find . -perm 644
./auto/gnip-1.0.tar.gz
./auto/gnip.o
./auto/.deps/gnip.Po

find命令与xargs命令相结合使用

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

例5:查找当前目录下所有的.c文件,并在文件中搜索stat字符串,输出包含stat的行和行号
[bugboy@bugboy test]$ find . -name "*.c" | xargs grep -n stat
./stat.c:3:#include <sys/stat.h>
./stat.c:5:#include <sys/statvfs.h>
./stat.c:9:    struct statvfs fsd;
./stat.c:11:    statvfs("/", &fsd);
./fstatvfs.c:2:#include <sys/statvfs.h>
./fstatvfs.c:4:#include <sys/stat.h>
./fstatvfs.c:10:    struct statvfs vfs;
./fstatvfs.c:14:    if (fstatvfs(fd, &vfs) < 0) {
./fstatvfs.c:15:        fprintf(stderr, "fstatvfs error()./n");
./statl.c:2:#include <sys/stat.h>
./statl.c:8:    struct stat statbuf;
./statl.c:15:    stat(argv[1], &statbuf);
./statl.c:16:    if (S_ISDIR(statbuf.st_mode)) {
./statl.c:18:    } else if (S_ISBLK(statbuf.st_mode)) {
./test.c:7:static int get_netmask_len(const char *netmask)


3、which, whereis

which命令在PATH环境变量中查找可执行文件,并打印出文件的全路径。例
[bugboy@bugboy test]$ which test
/usr/bin/test
[bugboy@bugboy test]$ which ls man find
alias ls='ls --color=tty'
        /bin/ls
/usr/bin/man
/usr/bin/find
分享到:
评论

相关推荐

    LINUX常用命令详解

    16. find 17. grep 18. more 19. less 20. head 21. tail 22. cut 23. at 24. crontab 25. sleep 26. kill 27. ps pstree 28. top 29. expr 30. locate 31. split 33. man,info 34. alias 35. unalias 36. clear

    Linux中利用grep命令如何检索文件内容详解

    主要给大家介绍了关于Linux中利用grep命令如何检索文件内容的相关资料,并且给大家简单介绍了关于Linux grep和find的区别,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

    [linux下的find文件查找命令与grep文件内容查找命令]linuxfindgrep.docx

    [linux下的find文件查找命令与grep文件内容查找命令]linuxfindgrep.docx

    Linux操作系统基础教程.pdf

    小白课,总结得很好、很容易看懂,看完一遍你就入门了! 讲得都是精华,IT大佬当年就是从它入门的! 精华内容如下: Linux 与 与 GNU ...查找、比较、统计、甄别文件:grep find tee等 makefile ssh、samba、 gcc

    Linux最佳入门-个人学习笔记-知识点总结.rar

    这是个人10年前的Linux Ubuntu学习笔记,之后查笔记时,都会补充新知识,也有纠错,涵盖了10个PDF文件,由有道笔记导出,非常适合初学者。这些PDF文件包含了丰富的知识和实用技巧,能够帮助您更好...1.10 find命令.pdf

    busybox-source-linux.tar.gz

    BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它...

    linux.chm文档

    rpm -qa | grep httpd 显示所有名称中包含 "httpd" 字样的rpm包 rpm -qi package_name 获取一个已安装包的特殊信息 rpm -qg "System Environment/Daemons" 显示一个组件的rpm包 rpm -ql package_name 显示一个...

    50个常见linux命令

    常见的linux命令, 1. tar, 2. grep,3. find,4. ssh,5. sed ,6. awk,7. vim

    linux 常用的30个命令总结.docx

    linux常用命令大全 1. ls :列出当前目录下的文件和文件夹。 2. cd :更改当前工作目录。 3. pwd:显示当前目录的绝对路径。 4. mkdir:创建一个新的目录。 5. touch:创建一个新的空文件或更新时间戳。 6. cp :...

    linux 常用命令总结.docx

    linux常用命令大全 1. ls :列出当前目录下的文件和文件夹。 2. cd :更改当前工作目录。 3. pwd:显示当前目录的绝对路径。 4. mkdir:创建一个新的目录。 5. touch:创建一个新的空文件或更新时间戳。 6. cp :...

    Linux下find和grep常用命令及区别介绍

    在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep,这两个命令还是有区别的,下面通过本文给大家讲解Linux下find和grep常用命令及区别介绍,需要的的朋友参考下吧

    华为linux入门内部资料

    1.2.1 登录和退出 Linux 系统.........................................................................................6 1.2.2 文件和目录操作命令 ............................................................

    深入LinuxUnix命令 脚本 调试.pdf

    1.3.9.结合 FIND 执行命令或动作 ............................................................................................ 12 1.3.10.让 FIND 跳过特定的目录 .............................................

    BusyBox 简化嵌入式 Linux 系统.doc

    BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet(不过它的选项比传统的版本要少);有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。本文将...

    Linux与Unix shell编程指南

    Linux与Unix shell编程指南(完整高清版).pdf 第一部分 shell ..................................................................................................................... 2 第1 章 文件安全与...

    工作中常用的linux命令

    工作中采用的 linux 命令 ........................................................................................................ 3 1.从其他机器拷贝文件夹 .................................................

    Linux命令搜索工具linux-command.zip

    diff、diffstat、file、find、git、gitview、ln、locate、lsattr、mattrib、mc、mcopy、mdel、mdir、mktemp、mmove、mread、mren、mshowfat、mtools、mtoolstest、mv、od、paste、patch、rcp、rhmask、rm、slocate...

    windows dos环境下直接运行linux命令集合

    find.exe pinky.exe unix2dos.exe fmt.exe post-grohtml.exe unlink.exe fold.exe pr.exe unprotoize-3.exe frcode.exe pre-grohtml.exe unprotoize.exe gawk-3.1.6.exe printenv.exe users.exe gawk.exe printf.exe...

    find的用法很有用

    linux系统命令个人觉得很有用,仅适应linux系统 。

    Windows下使用的常用Linux命令集

    在Windows下,有些操作很不方便,因为没有Linux下强大的命令,比如grep、find、sed、tail、chmod等,本包就是可以让Windows直接支持一些常用的Linux命令。 使用方法: 解压“win32linux.zip”到任意目录,然后把该...

Global site tag (gtag.js) - Google Analytics