《快乐的 Linux 命令行》
grep
1
| grep [options] regex [file...]
|
选项列表:
选项 |
描述 |
-i |
忽略大小写,不会区分大小写字符。也可用--ignore-case 来指定。 |
-v |
不匹配。通常,grep 程序会打印包含匹配项的文本行。这个选项导致grep 程序只会打印不包含匹配项的文本行。也可用--invert-match 来指定。 |
-c |
打印匹配的数量(或者是不匹配的数目,若指定了-v 选项),而不是文本行本身。也可用--count 选项来指定。 |
-l |
打印包含匹配项的文件名,而不是文本行本身,也可用--files-with-matches 选项来指定。 |
-L |
相似于-l 选项,但是只是打印不包含匹配项的文件名。也可用--files-without-match 来指定。 |
-n |
在每个匹配行之前打印出其位于文件中的相应行号。也可用--line-number 选项来指定。 |
-h |
应用于多文件搜索,不输出文件名。也可用--no-filename 选项来指定。 |
测试
1 2 3 4 5 6
| $ ls /bin > dirlist-bin.txt $ ls /usr/bin > dirlist-usr-bin.txt $ ls /sbin > dirlist-sbin.txt $ ls /usr/sbin > dirlist-usr-sbin.txt $ ls dirlist*.txt dirlist-bin.txt dirlist-sbin.txt dirlist-usr-bin.txt dirlist-usr-sbin.txt
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| $ grep bzip dirlist*.txt dirlist-bin.txt:bzip2 dirlist-bin.txt:bzip2recover
$ grep -l bzip dirlist*.txt dirlist-bin.txt
$ grep -L bzip dirlist*.txt dirlist-sbin.txt dirlist-usr-bin.txt dirlist-usr-sbin.txt
$ grep -h '.zip' dirlist*.txt bunzip2 bzip2 bzip2recover gunzip gzip funzip gpg-zip mzip preunzip prezip prezip-bin unzip unzipsfx
$ grep -h '^zip' dirlist*.txt zip zipcloak zipdetails zipgrep zipinfo zipnote zipsplit
$ grep -h 'zip$' dirlist*.txt gunzip gzip funzip gpg-zip mzip preunzip prezip unzip zip
$ grep -h '^zip$' dirlist*.txt zip
grep -i '^..j.r$' /usr/share/dict/words Major major
|
/usr/share/dict/
目录下有个英文字典。
中括号表达式中使用元字符,插入字符^
被用来表示否定,连字符字符-
被用来表示一个字符范围。
一个否定的字符集仍然在给定位置要求一个字符,但是这个字符必须不是否定字符集的成员。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| $ grep -h '.zip' dirlist*.txt | wc -l 13 $ grep -h '[bg]zip' dirlist*.txt | wc -l 3 $ grep -h '[^bg]zip' dirlist*.txt | wc -l 10 $ grep -h '[^bg]zip' dirlist*.txt bunzip2 gunzip funzip gpg-zip mzip preunzip prezip prezip-bin unzip unzipsfx
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| $ grep -h '^[ABCDEFGHIJKLMNOPQRSTUVWXZY]' dirlist*.txt GET HEAD POST X X11 Xephyr Xorg Xwayland ModemManager NetworkManager
$ grep -h '^[A-Z]' dirlist*.txt GET HEAD POST X X11 Xephyr Xorg Xwayland ModemManager NetworkManager
$ grep -h '^[A-Za-z0-9]' dirlist*.txt | wc -l 2344
|
如果正则表达式中需要包含连字符-
,让它成为表达式的第一个字符:
1 2
| grep -h '[-AZ]' dirlist*.txt
|
POSIX
把正则表达式的实现分成了两类:基本正则表达式
(BRE)和扩展的正则表达式
(ERE)。
BRE
的元素集合:
ERE
额外添加的元字符:
|
代表交替:
1 2 3 4 5 6
| $ echo "AAA" | grep -E 'AAA|BBB' AAA $ echo "BBB" | grep -E 'AAA|BBB' BBB $ echo "CCC" | grep -E 'AAA|BBB'
|
?
匹配零个或一个元素,表示前面的字符可有可无:
1 2 3 4
| $ echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$' (555) 123-4567 $ echo "555 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$' 555 123-4567
|
*
匹配零个或多个元素。
+
匹配一个或多个元素。
{}
匹配特定个数的元素:
选项 |
描述 |
n |
匹配前面的元素,如果它确切地出现了n 次 |
n,m |
匹配前面的元素,如果它至少出现了n 次,但是不多于m 次 |
n, |
匹配前面的元素,如果它出现了n 次或多于n 次 |
,m |
匹配前面的元素,如果它出现的次数不多于m 次 |
1 2
| $ echo "(555) 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$' (555) 123-4567
|
生成电话号码文件:
1
| for i in {1..10}; do echo "(${RANDOM:0:3}) ${RANDOM:0:3}-${RANDOM:0:4}" >> phonelist.txt; done
|
查找有问题的项:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| $ cat phonelist.txt (156) 891-573 (551) 310-2301 (197) 501-1688 (108) 737-3818 (822) 225-1332 (13) 200-1923 (137) 105-1455 (391) 180-2722 (317) 546-2211 (172) 279-9606 $ grep -Ev '^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$' phonelist.txt (156) 891-573 (13) 200-1923
|
273/505