标题: [转载教程] grep替代工具ack [打印本页]
作者: sxw 时间: 2013-4-21 18:48 标题: grep替代工具ack
网址:http://betterthangrep.com/
安装:Install the CPAN module App::Ack
粗略翻译下用法,并给出例子:- Usage: ack [OPTION]... PATTERN [FILE]
-
- 从当前目录树向下对每个源文件进行模式搜索。如果指定了[FILES],则只检查那些指定的文件/文件夹。
-
- 默认地,开关可能在 ACK_OPTIONS环境变量中指定或通过一个.ackrc文件指定。
- 如果你不想在环境中有依赖,可以使用 --noenv 关闭它。
-
- Example: ack -i select
-
- 搜索:
- -i, --ignore-case 在PATTERN中不区分大小写
- --[no]smart-case 如果PATTERN中不包含大写字母,则在PATTERN中不区分大小写。如果指定了-i开关则忽略该开关。
- -v, --invert-match 反转匹配:选择不匹配的行
- -w, --word-regexp 强制PATTERN只匹配整个单词
- -Q, --literal 引起所有元字符;PATTERN是字面上的
-
- 搜索输出:
- --line=NUM 只打印每个文件的第几行
- -l, --files-with-matches
- 只打印含有匹配的的文件名
- -L, --files-without-matches
- 只打印不含匹配的文件名
- -o 只显示匹配PATTERN的行的一部分(关闭文本高亮)
- --passthru 打印所有行,不管匹配与否(只有匹配的PATTERN才会高亮显示)
- --output=expr 输出每行表达式的值(关闭文本高亮)
- --match PATTERN 明确地指定PATTERN.
- -m, --max-count=NUM 在NUM个匹配之后,在每个文件中停止搜索
- -1 在任何形式的一个匹配之后停止搜索
- -H, --with-filename 为每次匹配打印文件名和行号
- -h, --no-filename 输出时抑制文件前缀
- -c, --count 显示每个文件中匹配的行数
- --column 显示第一个匹配的列数(就是从第几列开始匹配)
-
- -A NUM, --after-context=NUM
- 在匹配行之后再打印NUM数量的行(包括匹配的那行)
- -B NUM, --before-context=NUM
- 在匹配行之前再打印NUM数量的行(包括匹配的那行).
- -C [NUM], --context[=NUM]
- 在匹配行的前面和后面各打印NUM数量的行(NUM默认为2).
-
- --print0 在文件名之间打印空字节作为分隔符,这只对-f, -g, -l, -L or -c有效.
-
- 文件描述:
- --pager=COMMAND 通过COMMAND传送所有ack的输出,例如:
- --pager="less -R". 如果输出被重定向,则忽略该选项.
- --nopager 不通过分页程序发送输出.取消在 ~/.ackrc, ACK_PAGER or ACK_PAGER_COLOR中的任何设置.
- --[no]heading Print a filename heading above each file's results.
- (默认在交互环境下开启)
- --[no]break 在不同文件的结果之间打印一个中断(默认在交互时开启)
- --group 与 --heading --break相同
- --nogroup 与 --noheading --nobreak相同
- --[no]color 高亮匹配的文本(默认开启,除非输出被重定向或在Windows下)
- --[no]colour 与--[no]color一样
- --color-filename=COLOR
- --color-match=COLOR
- --color-lineno=COLOR 为文件名、匹配和行号设置颜色。
- --flush 立即清空输出,即使ack用于非交互环境中(当输出到管道或文件中)。
-
-
- 文件查找:
- -f 只打印找到的文件,不搜索.
- 不能指定模式.
- -g REGEX 与-f相同,但只打印匹配REGEX的文件.
- --sort-files 按词法顺序排序找到的文件.
- --invert-file-match 打印/搜索不匹配-g/-G的句柄文件.
- --show-types 显示每个文件拥有的类型.
-
- 文件包含/排除:
- -a, --all-types 搜索所有的文件类型,
- 忽略CVS,.svn和其它被忽略的文件夹
-
- -u, --unrestricted 搜索所有的文件和文件夹
- --[no]ignore-dir=name 从忽略文件夹列表中添加/移除文件夹(就是搜索时忽略这些文件夹)
- -r, -R, --recurse 递归到子文件夹(ack的默认行为)
- -n, --no-recurse 不递归到子文件夹
- -G REGEX 只搜索匹配REGEX的文件
-
- --perl 只包含Perl文件.
- --type=perl 只包含Perl文件.
- --noperl 排除Perl文件.
- --type=noperl 排除Perl文件.
- 对于ack支持的文件类型,查看"ack --help type"
-
- --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 跟踪符号链接。默认是关闭的.
-
- 默认被忽略的文件夹:
- autom4te.cache, blib, _build, .bzr, .cdv, cover_db, CVS, _darcs, ~.dep,
- ~.dot, .git, .hg, _MTN, ~.nib, .pc, ~.plst, RCS, SCCS, _sgbak and .svn
-
- 不用检查类型的文件:
- /~$/ - Unix备份文件
- /#.+#$/ - Emacs交换文件
- /[._].*\.swp$/ - Vi(m)交换文件
- /core\.\d+$/ - 核心转储
- /[.-]min\.js$/ - Minified javascript文件
-
- 杂项:
- --noenv 忽略环境变量和~/.ackrc
- --help 帮助
- --man 手册页
- --version 显示版本和版权
- --thpppt 打印出logo
-
- 如果匹配,则退出状态是0,不匹配则退出状态是1
- 这是ack的1.96版本.
-
- 例子:
- ack -f --batch
- strawberry\c\bin\freetype-config.bat
- strawberry\c\bin\gdlib-config.bat
- strawberry\c\bin\libpng-config.bat
- strawberry\c\bin\libpng15-config.bat
- strawberry\c\bin\mysql_config.bat
- ----------------------------------------
- ack -g image
- strawberry\c\i686-w64-mingw32\include\imagehlp.h
- strawberry\c\include\freetype2\freetype\ftimage.h
- strawberry\perl\vendor\lib\Imager\include\imager.h
- strawberry\perl\vendor\lib\Imager\include\imageri.h
- -----------------------------------------------
- ack -g image --sort-files --show-types
- image-get_image.pl => perl,text
- image.pl => perl,text
- image_url.pl => perl,text
- strawberry\c\i686-w64-mingw32\include\imagehlp.h => objcpp,cc,objc,cpp,hh,text
- strawberry\c\include\freetype2\freetype\ftimage.h => objcpp,cc,objc,cpp,hh,text
- strawberry\perl\vendor\lib\Imager\include\imager.h => objcpp,cc,objc,cpp,hh,text
- strawberry\perl\vendor\lib\Imager\include\imageri.h => objcpp,cc,objc,cpp,hh,text
- -------------------------------------------
- ack -i -w filename ack.txt
- -H, --with-filename 为每次匹配打印文件名Print the filename for each match
- -h, --no-filename Suppress the prefixing filename on output
- --[no]heading Print a filename heading above each file's results.
- --color-filename=COLOR
- ---------------------------------
- ack -i --line=6 ack.txt url.pl#分别打印文件ack.txt和url.txt的第6行
- ack.txt
- 6:one of FILES is "-".
-
- url.pl
- 6:my $filename=get('http://www.jb51.net/list/list_125_1.htm');
- ----------------------------------------
- ack -o file ack.txt
- file
- file
- file
- file
- file
- ------------------------------------
- ack --match filename -m 3 ack.txt
- -H, --with-filename 为每次匹配打印文件名Print the filename for each match
- -h, --no-filename Suppress the prefixing filename on output
- --print0 Print null byte as separator between filenames,
- -----------------------------------
- ack --match filename -c ack.txt
- 15
- -----------------------------------
- ack --match expr -A 1 ack.txt
- --output=expr 输出每行表达式的值(关闭文本高亮)
- --match PATTERN 明确地指定PATTERN.
-
- ack --match expr -A 2 ack.txt
- --output=expr 输出每行表达式的值(关闭文本高亮)
- --match PATTERN 明确地指定PATTERN.
- -m, --max-count=NUM 在NUM个匹配之后,在每个文件中停止搜索
- ------------------------------------------
- ack --match Suppress -B 2 ack.txt
- -1 在任何形式的一个匹配之后停止搜索
- -H, --with-filename 为每次匹配打印文件名和行号
- -h, --no-filename Suppress the prefixing filename on output
- ------------------------------------------------
- ack --match filename --print0 -c ack.txt 3.txt
- ack.txt:18
- ------------------------------------------------
- ack --type-set TYPE=.bat \.bat$
- strawberry\perl\lib\File\DosGlob.pm
- 307:perlglob.bat
-
- strawberry\perl\lib\pods\perlce.pod
- 103: compile.bat
- 121: compile.bat
-
- strawberry\perl\lib\pods\perldos.pod
- 150: configure.bat
-
- strawberry\perl\lib\pods\perlnetware.pod
- 39:=item SetNWBld.bat
- 46:=item Buildtype.bat
- 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 |