Board logo

标题: [转载教程] grep替代工具ack [打印本页]

作者: sxw    时间: 2013-4-21 18:48     标题: grep替代工具ack

网址:http://betterthangrep.com/

安装:Install the CPAN module App::Ack

粗略翻译下用法,并给出例子:
  1. Usage: ack [OPTION]... PATTERN [FILE]
  2. 从当前目录树向下对每个源文件进行模式搜索。如果指定了[FILES],则只检查那些指定的文件/文件夹。
  3. 默认地,开关可能在 ACK_OPTIONS环境变量中指定或通过一个.ackrc文件指定。
  4. 如果你不想在环境中有依赖,可以使用 --noenv 关闭它。
  5. Example: ack -i select
  6. 搜索:
  7.   -i, --ignore-case     在PATTERN中不区分大小写
  8.   --[no]smart-case      如果PATTERN中不包含大写字母,则在PATTERN中不区分大小写。如果指定了-i开关则忽略该开关。
  9.   -v, --invert-match    反转匹配:选择不匹配的行
  10.   -w, --word-regexp     强制PATTERN只匹配整个单词
  11.   -Q, --literal         引起所有元字符;PATTERN是字面上的
  12. 搜索输出:
  13.   --line=NUM            只打印每个文件的第几行
  14.   -l, --files-with-matches
  15.                         只打印含有匹配的的文件名
  16.   -L, --files-without-matches
  17.                         只打印不含匹配的文件名
  18.   -o                    只显示匹配PATTERN的行的一部分(关闭文本高亮)
  19.   --passthru            打印所有行,不管匹配与否(只有匹配的PATTERN才会高亮显示)
  20.   --output=expr         输出每行表达式的值(关闭文本高亮)
  21.   --match PATTERN       明确地指定PATTERN.
  22.   -m, --max-count=NUM   在NUM个匹配之后,在每个文件中停止搜索
  23.   -1                    在任何形式的一个匹配之后停止搜索
  24.   -H, --with-filename   为每次匹配打印文件名和行号
  25.   -h, --no-filename     输出时抑制文件前缀
  26.   -c, --count           显示每个文件中匹配的行数
  27.   --column              显示第一个匹配的列数(就是从第几列开始匹配)
  28.   -A NUM, --after-context=NUM
  29.                         在匹配行之后再打印NUM数量的行(包括匹配的那行)
  30.   -B NUM, --before-context=NUM
  31.                         在匹配行之前再打印NUM数量的行(包括匹配的那行).
  32.   -C [NUM], --context[=NUM]
  33.                         在匹配行的前面和后面各打印NUM数量的行(NUM默认为2).
  34.   --print0              在文件名之间打印空字节作为分隔符,这只对-f, -g, -l, -L or -c有效.
  35. 文件描述:
  36.   --pager=COMMAND       通过COMMAND传送所有ack的输出,例如:
  37.                         --pager="less -R". 如果输出被重定向,则忽略该选项.
  38.   --nopager             不通过分页程序发送输出.取消在 ~/.ackrc, ACK_PAGER or ACK_PAGER_COLOR中的任何设置.
  39.   --[no]heading         Print a filename heading above each file's results.
  40.                         (默认在交互环境下开启)
  41.   --[no]break           在不同文件的结果之间打印一个中断(默认在交互时开启)
  42.   --group               与 --heading --break相同
  43.   --nogroup             与 --noheading --nobreak相同
  44.   --[no]color           高亮匹配的文本(默认开启,除非输出被重定向或在Windows下)
  45.   --[no]colour          与--[no]color一样
  46.   --color-filename=COLOR
  47.   --color-match=COLOR
  48.   --color-lineno=COLOR  为文件名、匹配和行号设置颜色。
  49.   --flush               立即清空输出,即使ack用于非交互环境中(当输出到管道或文件中)。
  50.                        
  51. 文件查找:
  52.   -f                    只打印找到的文件,不搜索.
  53.                         不能指定模式.
  54.   -g REGEX              与-f相同,但只打印匹配REGEX的文件.
  55.   --sort-files          按词法顺序排序找到的文件.
  56.   --invert-file-match   打印/搜索不匹配-g/-G的句柄文件.
  57.   --show-types          显示每个文件拥有的类型.
  58. 文件包含/排除:
  59.   -a, --all-types       搜索所有的文件类型,
  60.                         忽略CVS,.svn和其它被忽略的文件夹
  61.       
  62.   -u, --unrestricted    搜索所有的文件和文件夹
  63.   --[no]ignore-dir=name 从忽略文件夹列表中添加/移除文件夹(就是搜索时忽略这些文件夹)
  64.   -r, -R, --recurse     递归到子文件夹(ack的默认行为)
  65.   -n, --no-recurse      不递归到子文件夹
  66.   -G REGEX              只搜索匹配REGEX的文件
  67.   --perl                只包含Perl文件.
  68.   --type=perl           只包含Perl文件.
  69.   --noperl              排除Perl文件.
  70.   --type=noperl         排除Perl文件.
  71.                         对于ack支持的文件类型,查看"ack --help type"
  72.   --type-set TYPE=.EXTENSION[,.EXT2[,...]]
  73.                         Files with the given EXTENSION(s) are recognized as
  74.                         being of type TYPE. This replaces an existing
  75.                         definition for type TYPE.
  76.   --type-add TYPE=.EXTENSION[,.EXT2[,...]]
  77.                         Files with the given EXTENSION(s) are recognized as
  78.                         being of (the existing) type TYPE
  79.   --[no]follow          跟踪符号链接。默认是关闭的.
  80.   默认被忽略的文件夹:
  81.     autom4te.cache, blib, _build, .bzr, .cdv, cover_db, CVS, _darcs, ~.dep,
  82.     ~.dot, .git, .hg, _MTN, ~.nib, .pc, ~.plst, RCS, SCCS, _sgbak and .svn
  83.   不用检查类型的文件:
  84.     /~$/            - Unix备份文件
  85.     /#.+#$/         - Emacs交换文件
  86.     /[._].*\.swp$/ - Vi(m)交换文件
  87.     /core\.\d+$/  - 核心转储
  88.     /[.-]min\.js$/  - Minified javascript文件
  89. 杂项:
  90.   --noenv               忽略环境变量和~/.ackrc
  91.   --help                帮助
  92.   --man                 手册页
  93.   --version             显示版本和版权
  94.   --thpppt              打印出logo
  95. 如果匹配,则退出状态是0,不匹配则退出状态是1
  96. 这是ack的1.96版本.
  97. 例子:
  98. ack -f --batch
  99. strawberry\c\bin\freetype-config.bat
  100. strawberry\c\bin\gdlib-config.bat
  101. strawberry\c\bin\libpng-config.bat
  102. strawberry\c\bin\libpng15-config.bat
  103. strawberry\c\bin\mysql_config.bat
  104. ----------------------------------------
  105. ack -g image
  106. strawberry\c\i686-w64-mingw32\include\imagehlp.h
  107. strawberry\c\include\freetype2\freetype\ftimage.h
  108. strawberry\perl\vendor\lib\Imager\include\imager.h
  109. strawberry\perl\vendor\lib\Imager\include\imageri.h
  110. -----------------------------------------------
  111. ack -g image --sort-files --show-types
  112. image-get_image.pl => perl,text
  113. image.pl => perl,text
  114. image_url.pl => perl,text
  115. strawberry\c\i686-w64-mingw32\include\imagehlp.h => objcpp,cc,objc,cpp,hh,text
  116. strawberry\c\include\freetype2\freetype\ftimage.h => objcpp,cc,objc,cpp,hh,text
  117. strawberry\perl\vendor\lib\Imager\include\imager.h => objcpp,cc,objc,cpp,hh,text
  118. strawberry\perl\vendor\lib\Imager\include\imageri.h => objcpp,cc,objc,cpp,hh,text
  119. -------------------------------------------
  120. ack -i -w filename ack.txt
  121.   -H, --with-filename   为每次匹配打印文件名Print the filename for each match
  122.   -h, --no-filename     Suppress the prefixing filename on output
  123.   --[no]heading         Print a filename heading above each file's results.
  124.   --color-filename=COLOR
  125. ---------------------------------
  126. ack -i --line=6  ack.txt url.pl#分别打印文件ack.txt和url.txt的第6行
  127. ack.txt
  128. 6:one of FILES is "-".
  129. url.pl
  130. 6:my $filename=get('http://www.jb51.net/list/list_125_1.htm');
  131. ----------------------------------------
  132. ack -o file  ack.txt
  133. file
  134. file
  135. file
  136. file
  137. file
  138. ------------------------------------
  139. ack --match filename -m 3 ack.txt
  140.   -H, --with-filename   为每次匹配打印文件名Print the filename for each match
  141.   -h, --no-filename     Suppress the prefixing filename on output
  142.   --print0              Print null byte as separator between filenames,
  143. -----------------------------------
  144. ack --match filename  -c ack.txt
  145. 15
  146. -----------------------------------
  147. ack --match expr -A 1 ack.txt
  148.   --output=expr         输出每行表达式的值(关闭文本高亮)
  149.   --match PATTERN       明确地指定PATTERN.
  150. ack --match expr -A 2 ack.txt
  151.   --output=expr         输出每行表达式的值(关闭文本高亮)
  152.   --match PATTERN       明确地指定PATTERN.
  153.   -m, --max-count=NUM   在NUM个匹配之后,在每个文件中停止搜索
  154. ------------------------------------------
  155. ack --match Suppress -B 2 ack.txt
  156.   -1                    在任何形式的一个匹配之后停止搜索
  157.   -H, --with-filename   为每次匹配打印文件名和行号
  158.   -h, --no-filename     Suppress the prefixing filename on output
  159. ------------------------------------------------
  160. ack --match filename --print0  -c ack.txt 3.txt
  161. ack.txt:18
  162. ------------------------------------------------
  163. ack --type-set TYPE=.bat  \.bat$
  164. strawberry\perl\lib\File\DosGlob.pm
  165. 307:perlglob.bat
  166. strawberry\perl\lib\pods\perlce.pod
  167. 103:  compile.bat
  168. 121:  compile.bat
  169. strawberry\perl\lib\pods\perldos.pod
  170. 150:        configure.bat
  171. strawberry\perl\lib\pods\perlnetware.pod
  172. 39:=item SetNWBld.bat
  173. 46:=item Buildtype.bat
  174. 49:build type only after executing SetNWBld.bat
复制代码
10大使用ack替代grep的理由:



1、它非常快,因为它只搜索你想要的东西

2、ack是纯Perl写的,可以运行在Windows上,除了Perl5,它没有其他依赖关系

3、独立版本( standalone version)没有使用非标准模块,所以你可以将它放在你的~/bin目录下面

4、搜索时默认是递归搜索,但是会忽略.svn,CVS和其他VCS文件夹



你可以输入什么?
         $ grep pattern $(find . -type f | grep -v '\.svn')
         $ ack pattern

5、ack会忽略大部分你不想搜索的无用的东西

VCS文件夹
blib, the Perl build directory
backup files like foo~ and #foo#
binary files, core dumps, etc
6、忽略.svn文件夹意味着ack在搜索树时,比grep更快

7、ack允许你指定要搜索的文件类型,就如 --perl或--nohtml

你可以输入什么?

$ grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn)
$ ack --perl pattern

注意ack的--perl也检查不带后缀的文件的shebang行,而find命令不会检查

8、文件过滤能力。这允许你创建给定类型的文件列表

$ ack -f --perl > all-perl-files

9、更好更灵活的搜索结果颜色高亮

10、使用真正的Perl正则表达式,而非GNU子集

11、允许你使用Perl的特殊变量指定输出。在C程序中查找所有的#include文件:

ack --cc '#include\s+<(.*)>' --output '$1' -h

12、很多命令行开关与GNU grep是相同的,所以你不需再重新再学习另一套:

-w does word-only searching
         -c shows counts per file of matches
         -l gives the filename instead of matching lines
          etc.

13、命令的名字可以少打25%的字符!



ack's command flags
$ ack --help
Usage: ack [OPTION]... PATTERN [FILE]

Search for PATTERN in each source file in the tree from cwd on down.
If [FILES] is specified, then only those files/directories are checked.
ack may also search STDIN, but only if no FILE are specified, or if
one of FILES is "-".

Default switches may be specified in ACK_OPTIONS environment variable or
an .ackrc file. If you want no dependency on the environment, turn it
off with --noenv.

Example: ack -i select



搜索:
  -i, --ignore-case     Ignore case distinctions in PATTERN
  --[no]smart-case      Ignore case distinctions in PATTERN,
                        only if PATTERN contains no upper case
                        Ignored if -i is specified
  -v, --invert-match    Invert match: select non-matching lines
  -w, --word-regexp     Force PATTERN to match only whole words
  -Q, --literal         Quote all metacharacters; PATTERN is literal



搜索输出:
  --line=NUM            Only print line(s) NUM of each file
  -l, --files-with-matches
                        Only print filenames containing matches
  -L, --files-without-matches
                        Only print filenames with no matches
  -o                    Show only the part of a line matching PATTERN
                        (turns off text highlighting)
  --passthru            Print all lines, whether matching or not
  --output=expr         Output the evaluation of expr for each line
                        (turns off text highlighting)
  --match PATTERN       Specify PATTERN explicitly.
  -m, --max-count=NUM   Stop searching in each file after NUM matches
  -1                    Stop searching after one match of any kind
  -H, --with-filename   Print the filename for each match
  -h, --no-filename     Suppress the prefixing filename on output
  -c, --count           Show number of lines matching per file
  --column              Show the column number of the first match

  -A NUM, --after-context=NUM
                        Print NUM lines of trailing context after matching
                        lines.
  -B NUM, --before-context=NUM
                        Print NUM lines of leading context before matching
                        lines.
  -C [NUM], --context[=NUM]
                        Print NUM lines (default 2) of output context.

  --print0              Print null byte as separator between filenames,
                        only works with -f, -g, -l, -L or -c.



文件描述:
  --pager=COMMAND       Pipes all ack output through COMMAND.  For example,
                        --pager="less -R".  Ignored if output is redirected.
  --nopager             Do not send output through a pager.  Cancels any
                        setting in ~/.ackrc, ACK_PAGER or ACK_PAGER_COLOR.
  --[no]heading         Print a filename heading above each file's results.
                        (default: on when used interactively)
  --[no]break           Print a break between results from different files.
                        (default: on when used interactively)
  --group               Same as --heading --break
  --nogroup             Same as --noheading --nobreak
  --[no]color           Highlight the matching text (default: on unless
                        output is redirected, or on Windows)
  --[no]colour          Same as --[no]color
  --color-filename=COLOR
  --color-match=COLOR
  --color-lineno=COLOR  Set the color for filenames, matches, and line numbers.
  --flush               Flush output immediately, even when ack is used
                        non-interactively (when output goes to a pipe or
                        file).

文件查找:
  -f                    Only print the files found, without searching.
                        The PATTERN must not be specified.
  -g REGEX              Same as -f, but only print files matching REGEX.
  --sort-files          Sort the found files lexically.
  --invert-file-match   Print/search handle files that do not match -g/-G.
  --show-types          Show which types each file has.



文件包含/排除:
  -a, --all-types       All file types searched;
                        Ignores CVS, .svn and other ignored directories
  -u, --unrestricted    All files and directories searched
  --[no]ignore-dir=name Add/Remove directory from the list of ignored dirs
  -r, -R, --recurse     Recurse into subdirectories (ack's default behavior)
  -n, --no-recurse      No descending into subdirectories
  -G REGEX              Only search files that match REGEX

  --perl                Include only Perl files.
  --type=perl           Include only Perl files.
  --noperl              Exclude Perl files.
  --type=noperl         Exclude Perl files.
                        See "ack --help type" for supported filetypes.

  --type-set TYPE=.EXTENSION[,.EXT2[,...]]
                        Files with the given EXTENSION(s) are recognized as
                        being of type TYPE. This replaces an existing
                        definition for type TYPE.
  --type-add TYPE=.EXTENSION[,.EXT2[,...]]
                        Files with the given EXTENSION(s) are recognized as
                        being of (the existing) type TYPE

  --[no]follow          Follow symlinks.  Default is off.



  默认被忽略的文件夹:
    autom4te.cache, blib, _build, .bzr, .cdv, cover_db, CVS, _darcs, ~.dep,
    ~.dot, .git, .hg, _MTN, ~.nib, .pc, ~.plst, RCS, SCCS, _sgbak and .svn



  不被查找的文件类型:
    /~$/            - Unix backup files
    /#.+#$/         - Emacs swap files
    /[._].*\.swp$/ - Vi(m) swap files
    /core\.\d+$/  - core dumps
    /[.-]min\.js$/  - Minified javascript files



杂项:
  --noenv               Ignore environment variables and ~/.ackrc
  --help                This help
  --man                 Man page
  --version             Display version & copyright
  --thpppt              Bill the Cat

Exit status is 0 if match, 1 if no match.

This is version 1.96 of ack.


--------------------------------------------------------------------------------

ack理解的文件类型

$ ack --help-types
Usage: ack [OPTION]... PATTERN [FILES]

The following is the list of filetypes supported by ack.  You can
specify a file type with the --type=TYPE format, or the --TYPE
format.  For example, both --type=perl and --perl work.

Note that some extensions may appear in multiple types.  For example,
.pod files are both Perl and Parrot.

--[no]actionscript .as .mxml
    --[no]ada          .ada .adb .ads
    --[no]asm          .asm .s
    --[no]batch        .bat .cmd
    --[no]binary       Binary files, as defined by Perl's -B op (default: off)
    --[no]cc           .c .h .xs
    --[no]cfmx         .cfc .cfm .cfml
    --[no]clojure      .clj
    --[no]cpp          .cpp .cc .cxx .m .hpp .hh .h .hxx
    --[no]csharp       .cs
    --[no]css          .css
    --[no]delphi       .pas .int .dfm .nfm .dof .dpk .dproj .groupproj .bdsgroup .bdsproj
    --[no]elisp        .el
    --[no]erlang       .erl .hrl
    --[no]fortran      .f .f77 .f90 .f95 .f03 .for .ftn .fpp
    --[no]go           .go
    --[no]groovy       .groovy .gtmpl .gpp .grunit
    --[no]haskell      .hs .lhs
    --[no]hh           .h
    --[no]html         .htm .html .shtml .xhtml
    --[no]java         .java .properties
    --[no]js           .js
    --[no]jsp          .jsp .jspx .jhtm .jhtml
    --[no]lisp         .lisp .lsp
    --[no]lua          .lua
    --[no]make         Makefiles (including *.mk and *.mak)
    --[no]mason        .mas .mhtml .mpl .mtxt
    --[no]objc         .m .h
    --[no]objcpp       .mm .h
    --[no]ocaml        .ml .mli
    --[no]parrot       .pir .pasm .pmc .ops .pod .pg .tg
    --[no]perl         .pl .pm .pod .t
    --[no]php          .php .phpt .php3 .php4 .php5 .phtml
    --[no]plone        .pt .cpt .metadata .cpy .py
    --[no]python       .py
    --[no]rake         Rakefiles
    --[no]ruby         .rb .rhtml .rjs .rxml .erb .rake .spec
    --[no]scala        .scala
    --[no]scheme       .scm .ss
    --[no]shell        .sh .bash .csh .tcsh .ksh .zsh
    --[no]skipped      Files, but not directories, normally skipped by ack (default: off)
    --[no]smalltalk    .st
    --[no]sql          .sql .ctl
    --[no]tcl          .tcl .itcl .itk
    --[no]tex          .tex .cls .sty
    --[no]text         Text files, as defined by Perl's -T op (default: off)
    --[no]tt           .tt .tt2 .ttml
    --[no]vb           .bas .cls .frm .ctl .vb .resx
    --[no]verilog      .v .vh .sv
    --[no]vhdl         .vhd .vhdl
    --[no]vim          .vim
    --[no]xml          .xml .dtd .xsl .xslt .ent
    --[no]yaml         .yaml .yml
作者: BAT-VBS    时间: 2013-4-22 07:52

跟这个是同一个工具吗?
http://bbs.bathome.net/thread-19858-1-1.html
作者: sxw    时间: 2013-4-22 11:18

回复 2# BAT-VBS


      原来发过了。重复了又




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2