Grep
The full name is Global Regular Expression Print, which means global regular expression
It is a powerful text search tool that uses regular matching
1. Command format
grep [options] files
2. Main parameters
-c: output only Number of matching lines
-i: Case-insensitive
-n: Display matching navigation and line numbers
-l: When querying multiple files, only output file names containing matching characters
-v: Reverse matching, that is, display no Matching lines
-h: The file name is not applicable when querying
-s: No error message is displayed
3. Part of the regular expression
Antonym characters: such as """" means matching ""
^$ starts with End
[] single character, [A]
[-] matches a range, [0-9a-zA-Z] matches all numbers and letters
* the previous character appears 0 or more times
+ the previous character appears One or more times
. Any character
4. Classic scene
Unless you want to be case-sensitive, please add -i to ignore case
(1) Combine the find command and pipe
One of your music There are files in various formats in the folder, but you only want to find the mp3 file of the artist jay, and it does not contain any mixed tracks
[root@localhost ~]#find . -name ".mp3" | grep -i jay | grep -vi "remix"
Analysis: 1) Use find -name to list all mp3 files and redirect to grep
2) Use grep -i to find lines containing jay
3) Use grep -vi to find lines that do not Lines containing remix
(2)-A -B -C
Many times, we don’t care about matching lines but the context of matching lines. At this time, -A -B -C is useful
-A n n lines after, A is remembered as (After)
-B n n lines before, B is remembered as (Before)
-C n n lines before, n lines after , C memory is (Center)
Example
[root@localhost ~]# ifconfig | grep -A 2 "Link encap" eth0 Link encap:Ethernet HWaddr 00:0C:29:F3:38:15 inet addr:192.168.91.129 Bcast:192.168.91.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fef3:3815/64 Scope:Link -- lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host [root@localhost ~]# ifconfig | grep -C 2 "lo" Interrupt:67 Base address:0x2024 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host
(3) Use -c to count the number
You have a large file at hand. This file contains URLs, such as www.baidu.com tieba.baidu.com and so on. Do you want to know how many URLs belong to Baidu
[
root@localhost ~]# grep -c "*baidu.com*" filename 例子 [root@localhost ~]# cat file.txt wtmp begins Mon Feb 24 14:26:08 2014 192.168.0.1 162.12.0.123 "123" 123""123 njuhwc@163.com njuhwc@gmil.com 123 www.baidu.com tieba.baidu.com www.google.com www.baidu.com/search/index [root@localhost ~]# grep -cn ".*baidu.com.*" file.txt 3
(4) -r recursively search subdirectories
Find files containing matching characters under the current directory and its subdirectories
Search for subdirectories, and output the line number after matching, The dot here represents the current directory
[root@localhost ~]# grep -nr HELLO_HWC_CSND_BLOG* .
Example:
[root@localhost ~]# grep -nr baidu . ./file.txt:8:www.baidu.com ./file.txt:9:tieba.baidu.com ./file.txt:11:www.baidu.com/search/index ./test/test.txt:1:http://www.baidu.com
Search for subdirectories, and only output the file name after matching
[root@localhost ~]# grep -lr HELLO_HWC_CSND_BLOG* .
Example:
[root@localhost ~]# grep -lr baidu . ./file.txt ./test/test.txt
(5)--line-buffered Turn on buffering mode
You have a file that is dynamic, it constantly adds information to the end of the file, and you want the output to contain certain information OK. That is, continuously grep a dynamic stream
[root@localhost ~]#tail -f file | grep --line-buffered your_pattern
(6) Combined with ps to find the process
[root@localhost ~]# ps aux | grep init root 1 0.0 0.1 2072 632 ? Ss 22:52 0:01 init [5] root 4210 0.0 0.1 6508 620 ? Ss 23:01 0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "/usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients" root 4233 0.0 0.0 2780 504 ? S 23:01 0:00 /usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients root 4956 0.0 0.1 3920 680 pts/1 R+ 23:27 0:00 grep init
Here we see grep init us The executed commands are also listed
If we don’t want this line, we can change the command like this
[root@localhost ~]# ps aux | grep [i]nit root 1 0.0 0.1 2072 632 ? Ss 22:52 0:01 init [5] root 4210 0.0 0.1 6508 620 ? Ss 23:01 0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "/usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients" root 4233 0.0 0.0 2780 504 ? S 23:01 0:00 /usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients
(7) Find a directory that does not contain it
[root@localhost ~]#grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
Example
[root@localhost ~]# ls anaconda-ks.cfg Desktop file.txt find.result install.log install.log.syslog test [root@localhost ~]# grep -r baidu . ./file.txt:www.baidu.com ./file.txt:tieba.baidu.com ./file.txt:www.baidu.com/search/index ./test/test.txt:http://www.baidu.com
If we don't want to include the test directory at this time
[root@localhost ~]# grep -R --exclude-dir=text "baidu" . ./file.txt:www.baidu.com ./file.txt:tieba.baidu.com ./file.txt:www.baidu.com/search/index
If an error is reported
grep: unrecognized option `--exclude-dir=test'
it means the version is too old, update it and it will be ok
(8) Find the IP address
The -o and -P commands are used here
We check through man grep
-o, --only-matching:
Show only the part of a matching line that matches PATTERN.
-P, --perl- regexp:
Interpret PATTERN as a Perl regular expression.
That is to say -o, only display the part of the matching line that matches the regular expression
-P, as a Perl regular match
[root@localhost ~]# cat file.txt wtmp begins Mon Feb 24 14:26:08 2014 192.168.0.1 162.12.0.123 "123" 123""123 njuhwc@163.com njuhwc@gmil.com 123 www.baidu.com tieba.baidu.com www.google.com www.baidu.com/search/index [root@localhost ~]# grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}" file.txt 192.168.0.1 162.12.0.123
(9) Find the mailbox
[root @localhost ~]# grep -oP "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+" file. txt
example
[root@localhost ~]# cat file.txt wtmp begins Mon Feb 24 14:26:08 2014 192.168.0.1 162.12.0.123 "123" 123""123 njuhwc@163.com njuhwc@gmil.com 123 www.baidu.com tieba.baidu.com www.google.com www.baidu.com/search/index [root@localhost ~]# grep -oP "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+" file.txt njuhwc@163.com njuhwc@gmil.com