grep和ack的代替者Ag

前言

Ag 是类似ack, grep的工具,它来在文件搜索相应关键字。
官方列出了几点选择它的理由:

  • 它比ack还要快
  • 它会忽略.gitignore和.hgignore中的匹配文件
  • 如果有你想忽略的文件,你需要将(congh .min.js cough*)加入到.ignore文件
  • 它的命令名称更短:-)

安装

下载源码

下载地址: http://geoff.greer.fm/ag

安装PCRE

目前已经有PCRE2,但这里需要PCRE
https://downloads.sourceforge...
从官网下载.tar.gz的版本,注意不要下载zip版本
下载后解压缩正常安装

./configure --prefix=/usr                    \
            --docdir=/usr/share/doc/pcre-8.41 \
            --enable-unicode-properties      \
            --enable-pcre16                  \
            --enable-pcre32                  \
            --enable-pcregrep-libz            \
            --enable-pcregrep-libbz2          \
            --enable-pcretest-libreadline    \
            --disable-static                &&
make && make install

认是安装到/usr/local下

安装lzma

yum install xz-libs.x86_64 xz-devel.x86_64

安装Ag

./configure PCRE_CFLAGS="-I /usr/local/include" PCRE_LIBS="-L /usr/local/lib -lpcre" && make && make install

命令

Usage: ag [FILE-TYPE] [OPTIONS] PATTERN [PATH]

Recursively search for PATTERN in PATH.
Like grep or ack,but faster.

Example:
ag -i foo /bar/

Output Options:
--ackmate Print results in AckMate-parseable format
-A --after [LInes] Print lines after match (Default: 2)
-B --before [LInes] Print lines before match (Default: 2)
--[no]break Print newlines between matches in different files
(Enabled by default)
-c --count Only print the number of matches in each file.
(This often differs from the number of matching lines)
--[no]color Print color codes in results (Enabled by default)
--color-line-number Color codes for line numbers (Default: 1;33)
--color-match Color codes for result match numbers (Default: 30;43)
--color-path Color codes for path names (Default: 1;32)
--column Print column numbers in results
--[no]filename Print file names (Enabled unless searching a single file)
-H --[no]heading Print file names before each file's matches
(Enabled by default)
-C --context [LInes] Print lines before and after matches (Default: 2)
--[no]group Same as --[no]break --[no]heading
-g --filename-pattern PATTERN
Print filenames matching PATTERN
-l --files-with-matches Only print filenames that contain matches
(don't print the matching lines)
-L --files-without-matches
Only print filenames that don't contain matches
--print-all-files Print headings for all files searched,even those that
don't contain matches
--[no]numbers Print line numbers. Default is to omit line numbers
when searching streams
-o --only-matching Prints only the matching part of the lines
--print-long-lines Print matches on very long lines (Default: >2k characters)
--passthrough When searching a stream,print all lines even if they
don't match
--silent Suppress all log messages,including errors
--stats Print stats (files scanned,time taken,etc.)
--stats-only Print stats and nothing else.
(Same as --count when searching a single file)
--vimgrep Print results like vim's :vimgrep /pattern/g would
(it reports every match on the line)
-0 --null --print0 Separate filenames with null (for 'xargs -0')

Search Options:
-a --all-types Search all files (doesn't include hidden files
or patterns from ignore files)
-D --debug Ridiculous debugging (probably not useful)
--depth NUM Search up to NUM directories deep (Default: 25)
-f --follow Follow symlinks
-F --fixed-strings Alias for --literal for compatibility with grep
-G --file-search-regex PATTERN Limit search to filenames matching PATTERN
--hidden Search hidden files (obeys .*ignore files)
-i --ignore-case Match case insensitively
--ignore PATTERN Ignore files/directories matching PATTERN
(literal file/directory names also allowed)
--ignore-dir NAME Alias for --ignore for compatibility with ack.
-m --max-count NUM Skip the rest of a file after NUM matches (Default: 10,000)
--one-device Don't follow links to other devices.
-p --path-to-ignore STRING
Use .ignore file at STRING
-Q --literal Don't parse PATTERN as a regular expression
-s --case-sensitive Match case sensitively
-S --smart-case Match case insensitively unless PATTERN contains
uppercase characters (Enabled by default)
--search-binary Search binary files for matches
-t --all-text Search all text files (doesn't include hidden files)
-u --unrestricted Search all files (ignore .ignore,.gitignore,etc.;
searches binary and hidden files as well)
-U --skip-vcs-ignores Ignore VCS ignore files
(.gitignore,.hgignore; still obey .ignore)
-v --invert-match
-w --word-regexp Only match whole words
-W --width NUM Truncate match lines after NUM characters
-z --search-zip Search contents of compressed (e.g.,gzip) files

File Types:
The search can be restricted to certain types of files. Example:
ag --html needle
- Searches for 'needle' in files with suffix .htm,.html,.shtml or .xhtml.

For a list of supported file types run:
ag --list-file-types

ag was originally created by Geoff Greer. More information (and the latest release)
can be found at http://geoff.greer.fm/ag

自动安装脚本示例

#!/usr/bin/env bash
#Author: Harris Zhu
#Dep: make sure you have the root permission
#Usage . install_ag.sh
set -x
TEMP_DIR=$(mktemp -d Leslie.Guan.XXXXXX)
cd ${TEMP_DIR}
wget https://github.com/ggreer/the_silver_searcher/archive/master.zip
TAR_DIR=$(unzip *.zip)
TAR_DIR=${TAR_DIR%%/*}
TAR_DIR=${TAR_DIR##*:}
cd ${TAR_DIR}
apt-get install -y automake pkg-config libpcre3-dev zlib1g-dev liblzma-dev --force-yes
./build.sh && make install
cd ../../
rm -rf ${TEMP_DIR}
ag -V
set +x

pattern

示例一


由上面例子可以知道ag的pattern支持s,w等正则

后言

ag的使用非常简单,它的选项也不多,所以我在上面列出了它的help内容。它本身已经非常强大,搭配上fzf就会更强大,所以下一篇我会写fzf。

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...