使用shell搜索文本的几种方法

标签: shell 搜索 文本 | 发表时间:2011-08-20 19:46 | 作者:春秋十二月 Hobbes
出处:http://www.cppblog.com/
   第1种方法是使用find和xargs命令,示例如下
     find dir | xargs grep str,dir是指某个目录
     find file | xargs grep str,file是指某个文件
   注意:这种方法,会递归搜索子目录

   第2种方法是直接使用grep命令,示例如下
     grep str dir/*,dir是指某个目录,但不递归搜索其子目录
     grep -r str dir/*,使用-r选项,递归搜索其子目录
     grep str file,file是指某个文件

   第3种方法是综合以上两种,写一个shell脚本,代码如下   
   #!/bin/bash
   #find_str.sh   

   if [ $# -lt "2" ]; then
      echo "Usage: `basename $0` path name [option]"
      exit 1
   fi   
   #!-r表示递归处理子目录,-i表示忽略大小写
   path=$1
   name=$2  
   shift 
   shift   
  
   for option in "$@"
   do
     case $option in
     -r) dir_op="-r"
     ;;
     -i) lu_op="-i"
     ;;
     *) if [ -n "$option" ]; then
           echo "invalid option"
           exit 1
         fi
     ;;
    esac
   done    

   grep_str_of_file()
   {
        file=$1
        str=$2
        out=$(grep -n $lu_op "$str" "$file")
        if [ -n "$out" -a "$file" != "$0" ]; then
           echo "$file: $out"
        fi
    }    

   find_str()
   {
     if [ -d "$1" ]; then
     for file in $1/*
         do
           if [ "$dir_op" = "-r" -a -d "$file" ]; then
               find_str $file $2
           elif [ -f "$file" ]; then
              grep_str_of_file $file $2
           fi
        done
    elif [ -f "$1" ]; then
      grep_str_of_file $1 $2    
    fi
   }  

  find_str $path $name
 
   这样一来,不管$1参数是目录还是文件,都能处理,使用示例如下:
   ./find_str /usr/include main          不递归搜索子目录,大小写敏感
   ./find_str /usr/include main -i       不递归搜索子目录,忽略大小写
   ./find_str /usr/include main -r       递归搜索子目录,大小写敏感
   ./find_str /usr/include main -r  -i   递归搜索子目录,忽略大小写
 
   ./find_str main.cpp main              在文件中搜索,大小写敏感
   ./find_str main.cpp main -i           在文件中搜索,忽略大小写

   上面所述的示例中,str不限于特定的文本,可以是带正则表达式的匹配模式。
   而第3种方法,也可以用sed替换grep来显示文本行,在此基础上能作更多的处理,
   比如格式化显示、统计匹配的文本个数、搜索策略等,在此就不详究了  

春秋十二月 2011-08-20 19:46 发表评论

相关 [shell 搜索 文本] 推荐:

使用shell搜索文本的几种方法

- Hobbes - C++博客-首页原创精华区
   第1种方法是使用find和xargs命令,示例如下.      find dir | xargs grep str,dir是指某个目录.      find file | xargs grep str,file是指某个文件.    注意:这种方法,会递归搜索子目录.    第2种方法是直接使用grep命令,示例如下.

Shell编程

- - 博客园_首页
本来打算寒假回家好好学习Linux的,为以后学习嵌入式打好基础的. 回家之后的学习效率非常低,之前为了搭建Linux环境,折腾了很长时间,学到现在也就勉强才把Shell编程学完了. 今天就把自己学习的相关知识点总结整理一下. 个人感觉shell程序跟windows下的批处理文件有点像,就是将一些系统命令写进一个可执行文件中,然后执行.

shell 学习笔记

- tiger - 游戏人生
将脚本目录加到 PATH 中. 在 dash 中如何进行字符串替换. 将 rst 格式文档转换为 blog 可用的 html 代码. shell 脚本虽然不是非常复杂的程序, 但对于首次接触的我来讲, 多少还是有些忌惮. 不过, 接触任何新事物都需要勇敢面对, 逐步树立信心. 我是冲着把脚本写好去的, 所以, 我的目标是能够写出友好, 健壮, 优美的脚本..

GNOME Shell 3.2 预览

- timebug - LinuxTOY
近日 Allan 在他的博客上分享了最近在 GNOME Shell 3.2 上的开发进度. 整合聊天和消息程序(由 Guillaume Desmottes 开发). 登陆系统时自动登陆聊天服务,不再需要额外启动聊天程序. 直接在 Shell 即可语音通话,回复聊天邀请,文件传输. 通知计数器(由 Guillaume Desmottes 开发).

Ubuntu11.10 GNOME Shell指南

- 个人 - 译言-每日精品译文推荐
Ubuntu 11.10终于提供了一种安全方便的方式去安装和使用“GNOME Shell”——GNOME的新桌面交互接口. 这意味着不像之前的版本那样,现在它不需要任何额外的插件,或者执行任何可疑的脚本它可以从Ubuntu软件中心直接安装,只需一次简单的点击. 为了在ubuntu上获得更好的体验我们需要安装一些额外的插件.

Shell 小技巧一则

- Hinc - LinuxTOY
经常与 Shell 为伍的你是不是也会经常碰到下面这些情境:. 要保存某些文件到特定目录,然后开始查看/编辑 1$ cp /somewhere/foo.c /somewhere/foo.c.orig 2$ vi /somewhere/foo.c. 或者先备份某个文件,然后开始捣鼓 1$ tar zcvf archives.tgz /somewhere/folder /and/somewhere/file1 /and/somewhere/file2 2$ scp archives.tgz [email protected]:~/blabla/.

ibus的GNOME Shell扩展

- 小汐 - 画猫不成反类虎
更新代码,支持横排模式(设置后需要重启gnome shell). 这个扩展使用了ibus的一些新API,该API还没有发布,需要自行编译ibus的git仓库代码. 以前说过GNOME3的一个缺点,在通知栏聊天时,无法看到ibus的候选词界面,确切地说是候选词界面被通知栏聊天界面挡住了. 这是GNOME Shell的架构所决定的,目前没有方法可以绕过(除非修改GNOME Shell)本身.

移植Google Calendar到 GNOME Shell

- 欧剃 - 笨兔兔
GNOME Shell Google Calendar 将Google 日历移植到了GNOME Shell上. python脚本可保存密码,自动获取新的谷歌日历事件. 但目前没有图形化的配置界面,导入日历. GNOME 3.2(+3.1.90.x) 目前通过“Online accounts”已经移植了谷歌日历,但是只能在上述版本中实现.

Ubuntu 11.10 GNOME Shell 指南

- 雪冬 - 笨兔兔
注,本文由笔者翻译自 http://www.omgubuntu.co.uk/2011/10/gnome-shell-ubuntu-11-10-guide/. Ubuntu 11.10最终提供给喜欢猎奇的用户一个简单安全的方式来安装和尝试“GNOME Shell”——新的GNOME桌面接口. 这意味着不像之前的Ubuntu发行版,在Ubuntu中安装GNOME Shell不需要添加额外的软件源(PPA)或运行各种脚本:如今它可以在Ubuntu软件中心直接安装——只需要简单地点击一下鼠标即可完成.

Linux shell用法和技巧

- - 外刊IT评论
使用Linux shell是我每天的基本工作,但我经常会忘记一些有用的shell命令和l技巧. 当然,命令我能记住,但我不敢说能记得如何用它执行某个特定任务. 于是,我开始在一个文本文件里记录这些用法,并放在我的Dropbox里,现在,向大家分享这个文件. 需要注意一点的是,有些用法需要在你的Linux系统里安装额外的软件.