搜索
 找回密码
 立即注册
发新帖

bat教程[280] grep命令的用法

时间:2020-5-20 09:50 0 1849 | 复制链接 |

610

主题

610

帖子

0

积分

网站编辑

Rank: 8Rank: 8

积分
0
本帖最后由 O'Reilly 于 2020-6-3 22:52 编辑

(1)grep命令的简介
  1. C:\Users\86137>grep --help
  2. Usage: grep [OPTION]... PATTERN [FILE]...
  3. Search for PATTERN in each FILE or standard input.
  4. PATTERN is, by default, a basic regular expression (BRE).
  5. Example: grep -i 'hello world' menu.h main.c

  6. Regexp selection and interpretation:
  7.   -E, --extended-regexp     PATTERN is an extended regular expression (ERE)
  8.   -F, --fixed-strings       PATTERN is a set of newline-separated strings
  9.   -G, --basic-regexp        PATTERN is a basic regular expression (BRE)
  10.   -P, --perl-regexp         PATTERN is a Perl regular expression
  11.   -e, --regexp=PATTERN      use PATTERN for matching
  12.   -f, --file=FILE           obtain PATTERN from FILE
  13.   -i, --ignore-case         ignore case distinctions
  14.   -w, --word-regexp         force PATTERN to match only whole words
  15.   -x, --line-regexp         force PATTERN to match only whole lines
  16.   -z, --null-data           a data line ends in 0 byte, not newline

  17. Miscellaneous:
  18.   -s, --no-messages         suppress error messages
  19.   -v, --invert-match        select non-matching lines
  20.   -V, --version             display version information and exit
  21.       --help                display this help text and exit

  22. Output control:
  23.   -m, --max-count=NUM       stop after NUM matches
  24.   -b, --byte-offset         print the byte offset with output lines
  25.   -n, --line-number         print line number with output lines
  26.       --line-buffered       flush output on every line
  27.   -H, --with-filename       print the file name for each match
  28.   -h, --no-filename         suppress the file name prefix on output
  29.       --label=LABEL         use LABEL as the standard input file name prefix
  30.   -o, --only-matching       show only the part of a line matching PATTERN
  31.   -q, --quiet, --silent     suppress all normal output
  32.       --binary-files=TYPE   assume that binary files are TYPE;
  33.                             TYPE is 'binary', 'text', or 'without-match'
  34.   -a, --text                equivalent to --binary-files=text
  35.   -I                        equivalent to --binary-files=without-match
  36.   -d, --directories=ACTION  how to handle directories;
  37.                             ACTION is 'read', 'recurse', or 'skip'
  38.   -D, --devices=ACTION      how to handle devices, FIFOs and sockets;
  39.                             ACTION is 'read' or 'skip'
  40.   -r, --recursive           like --directories=recurse
  41.   -R, --dereference-recursive  likewise, but follow all symlinks
  42.       --include=FILE_PATTERN  search only files that match FILE_PATTERN
  43.       --exclude=FILE_PATTERN  skip files and directories matching FILE_PATTERN
  44.       --exclude-from=FILE   skip files matching any file pattern from FILE
  45.       --exclude-dir=PATTERN  directories that match PATTERN will be skipped.
  46.   -L, --files-without-match  print only names of FILEs containing no match
  47.   -l, --files-with-matches  print only names of FILEs containing matches
  48.   -c, --count               print only a count of matching lines per FILE
  49.   -T, --initial-tab         make tabs line up (if needed)
  50.   -Z, --null                print 0 byte after FILE name

  51. Context control:
  52.   -B, --before-context=NUM  print NUM lines of leading context
  53.   -A, --after-context=NUM   print NUM lines of trailing context
  54.   -C, --context=NUM         print NUM lines of output context
  55.   -NUM                      same as --context=NUM
  56.       --color[=WHEN],
  57.       --colour[=WHEN]       use markers to highlight the matching strings;
  58.                             WHEN is 'always', 'never', or 'auto'
  59.   -U, --binary              do not strip CR characters at EOL (MSDOS/Windows)
  60.   -u, --unix-byte-offsets   report offsets as if CRs were not there
  61.                             (MSDOS/Windows)

  62. 'egrep' means 'grep -E'.  'fgrep' means 'grep -F'.
  63. Direct invocation as either 'egrep' or 'fgrep' is deprecated.
  64. When FILE is -, read standard input.  With no FILE, read . if a command-line
  65. -r is given, - otherwise.  If fewer than two FILEs are given, assume -h.
  66. Exit status is 0 if any line is selected, 1 otherwise;
  67. if any error occurs and -q is not given, the exit status is 2.

  68. Report bugs to: bug-grep@gnu.org
  69. GNU grep home page: <http://www.gnu.org/software/grep/>
  70. General help using GNU software: <http://www.gnu.org/gethelp/>
复制代码

(2)grep命令的示例
示例1
  1. C:\Users\86137\Desktop>type c.txt
  2. bat
  3. oracle
  4. shell
  5. plsql
  6. java
  7. python
  8. julia
  9. C:\Users\86137\Desktop>grep python *.txt
  10. c.txt:python

  11. C:\Users\86137\Desktop>grep -v python c.txt
  12. bat
  13. oracle
  14. shell
  15. plsql
  16. java
  17. julia
复制代码

示例2
  1. C:\Users\86137\Desktop\c>grep -r python *
  2. 新建文件夹/c.txt:python
复制代码

示例3
  1. C:\Users\86137\Desktop>grep -i PYTHON c.txt
  2. Python

  3. C:\Users\86137\Desktop>grep -n "Python" c.txt
  4. 6:Python
复制代码

示例4
  1. C:\Users\86137\Desktop>grep -vc "Python" c.txt
  2. 6

  3. C:\Users\86137\Desktop>grep -c "Python" c.txt
  4. 1
复制代码

示例5
  1. C:\Users\86137\Desktop>grep -o "ython" c.txt
  2. ython
复制代码

示例6
  1. C:\Users\86137\Desktop>grep -A 2 Python c.txt
  2. Python
  3. julia

  4. C:\Users\86137\Desktop>grep -B 2 Python c.txt
  5. plsql
  6. java
  7. Python

  8. C:\Users\86137\Desktop>grep -C 2 Python c.txt
  9. plsql
  10. java
  11. Python
  12. julia
复制代码

示例7
fast grep(fgrep)和extended regular expression(egrep)
  1. C:\Users\86137\Desktop>grep -F "Python" c.txt
  2. Python

  3. C:\Users\86137\Desktop>grep -E "Python" c.txt
  4. Python
复制代码

示例8
使用基本正则表达式
. :任意一个字符。
[abc] :表示匹配一个字符,这个字符必须是abc中的一个。
[a-zA-Z] :表示匹配一个字符,这个字符必须是a-z或A-Z这52个字母中的一个。
[^123] :匹配一个字符,这个字符是除了1、2、3以外的所有字符。
对于一些常用的字符集,系统做了定义:
[A-Za-z] 等价于 [[:alpha:]]
[0-9] 等价于 [[:digit:]]
[A-Za-z0-9] 等价于 [[:alnum:]]
tab,space 等价于空白字符 [[:space:]]
[A-Z] 等价于 [[:upper:]]
[a-z] 等价于 [[:lower:]]
标点符号 [[:punct:]]

  1. C:\Users\86137\Desktop>grep  "Py.hon" c.txt
  2. Python=3

  3. C:\Users\86137\Desktop>grep  "[[:upper:]]ython" c.txt
  4. Python=3

  5. C:\Users\86137\Desktop>grep  "Python[^[:upper:]][[:digit:]]" c.txt
  6. Python=3

  7. C:\Users\86137\Desktop>grep  "Pytho[a-z]" c.txt
  8. Python=3

  9. C:\Users\86137\Desktop>grep  "Pytho[a-z][[:punct:]]" c.txt
  10. Python=3
复制代码
匹配次数:
{m,n\} :匹配其前面出现的字符至少m次,至多n次。
\? :匹配其前面出现的内容0次或1次,等价于\{0,1\}。
* :匹配其前面出现的内容任意次,等价于\{0,\},所以 ".*" 表述任意字符任意次,即无论什么内容全部匹配。
  1. C:\Users\86137\Desktop>grep "/.*sh" c.txt
  2. root:x:0:0:root:/root:/bin/bash
  3. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  4. sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

  5. C:\Users\86137\Desktop>grep "/.\{0,2\}sh" c.txt
  6. root:x:0:0:root:/root:/bin/bash
  7. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  8. sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

  9. C:\Users\86137\Desktop>grep -w ".\{0,2\}sh" c.txt
  10. root:x:0:0:root:/root:/bin/bash
复制代码

位置锚定
^ :锚定行首
$ :锚定行尾。技巧:"^$"用于匹配空白行。
\b或\<:锚定单词的词首。如"\blike"不会匹配alike,但是会匹配liker
\b或\>:锚定单词的词尾。如"\blike\b"不会匹配alike和liker,只会匹配like
\B :与\b作用相反。
  1. C:\Users\86137\Desktop>grep "h[        DISCUZ_CODE_19        ]quot; c.txt
  2. root:x:0:0:root:/root:/bin/bash

  3. C:\Users\86137\Desktop>grep "\<sh" c.txt
  4. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

  5. C:\Users\86137\Desktop>grep "\Bsh\b" c.txt
  6. root:x:0:0:root:/root:/bin/bash

  7. C:\Users\86137\Desktop>grep "\bsh\b" c.txt
复制代码

分组及引用
\(string\) :将string作为一个整体方便后面引用
\1 :引用第1个左括号及其对应的右括号所匹配的内容。
\2 :引用第2个左括号及其对应的右括号所匹配的内容。
\n :引用第n个左括号及其对应的右括号所匹配的内容。

示例:
以相同字母开始结尾的行
  1. C:\Users\86137\Desktop>grep "^\([[:alpha:]]\).*\1[        DISCUZ_CODE_20        ]quot; c.txt
  2. nobody:x:99:99:Nobody:/:/sbin/nologin
  3. ntp:x:38:38::/etc/ntp:/sbin/nologin
  4. nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
复制代码

扩展的(Extend)正则表达式(注意要使用扩展的正则表达式要加-E选项,或者直接使用egrep):
(1)匹配字符:这部分和基本正则表达式一样
(2)匹配次数:
* :和基本正则表达式一样
? :基本正则表达式是\?,二这里没有\。
{m,n} :相比基本正则表达式也是没有了\。
+ :匹配其前面的字符至少一次,相当于{1,}。
(3)位置锚定:和基本正则表达式一样。
(4)分组及引用:
(string) :相比基本正则表达式也是没有了\。
\1 :引用部分和基本正则表达式一样。
\n :引用部分和基本正则表达式一样。
(5)或者:
a|b :匹配a或b,注意a是指 | 的左边的整体,b也同理。比如 C|cat 表示的是 C或cat,而不是Cat或cat,如果要表示Cat或cat,则应该写为 (C|c)at 。记住(string)除了用于引用还用于分组。
注意
1:默认情况下,正则表达式的匹配工作在贪婪模式下,也就是说它会尽可能长地去匹配,比如某一行有字符串 abacb,如果搜索内容为 "a.*b" 那么会直接匹配 abacb这个串,而不会只匹配ab或acb。
2:所有的正则字符,如 [ 、* 、( 等,若要搜索 * ,而不是想把 * 解释为重复先前字符任意次,可以使用 \* 来转义。

示例
(1)检索0-255
  1. C:\Users\86137\Desktop>grep -E "[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]" c.txt
  2. IPADDR=127.0.0.1
  3. NETMASK=255.0.0.0
  4. NETWORK=127.0.0.0
  5. # If you're having problems with gated making 127.0.0.0/8 a martian,
  6. # you can change this to something else (255.255.255.255, for example)
  7. BROADCAST=127.255.255.255
复制代码
(2)检索由0-255的数字组合成IP
  1. C:\Users\86137\Desktop>grep -E "\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b" c.txt
  2. IPADDR=127.0.0.1
  3. NETMASK=255.0.0.0
  4. NETWORK=127.0.0.0
  5. # If you're having problems with gated making 127.0.0.0/8 a martian,
  6. # you can change this to something else (255.255.255.255, for example)
  7. BROADCAST=127.255.255.255
复制代码
  1. C:\Users\86137\Desktop>grep -E "\b(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b" c.txt
  2. IPADDR=127.0.0.1
  3. NETMASK=255.0.0.0
  4. NETWORK=127.0.0.0
  5. # If you're having problems with gated making 127.0.0.0/8 a martian,
  6. # you can change this to something else (255.255.255.255, for example)
  7. BROADCAST=127.255.255.255
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回列表 返回顶部