grep是Linux系统中一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
grep [option] pattern file
用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。
grep的规则表达式:
POSIX字符:
为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是[A-Za-z0-9]的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。
命令:
ps -ef|grep python
输出
ubuntu@VM-4-14-ubuntu:~$ ps -ef|grep python
root 744 1 0 Jul13 ? 00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root 882 1 0 Jul13 ? 00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
ubuntu 181537 180987 0 09:17 pts/0 00:00:00 grep --color=auto python
ubuntu@VM-4-14-ubuntu:~$
命令:
ps -ef|grep python -c
ps -ef|grep -c python
输出:
ubuntu@VM-4-14-ubuntu:~$ ps -ef|grep python -c
3
ubuntu@VM-4-14-ubuntu:~$ ps -ef|grep -c python
3
ubuntu@VM-4-14-ubuntu:~$
命令:
cat file2.txt |grep -f file1.txt
输出:
ubuntu@VM-4-14-ubuntu:~/grep$ cat file1.txt
java
ptthon
linux
android
ios
ubuntu@VM-4-14-ubuntu:~/grep$ cat file2.txt
windows 10
windows 7
linux
c#
java
php
python
hello word
ubuntu@VM-4-14-ubuntu:~/grep$ cat file2.txt |grep file1.txt
ubuntu@VM-4-14-ubuntu:~/grep$ cat file2.txt |grep -f file1.txt
linux
java
说明:输出file2.txt文件中含有从file1.txt文件中读取出的关键词的内容行。
命令:
cat file2.txt | grep -nf file1.txt
输出:
ubuntu@VM-4-14-ubuntu:~/grep$ cat file2.txt |grep -nf file1.txt
3:linux
5:java
ubuntu@VM-4-14-ubuntu:~/grep$
说明:输出 file2.txt 文件中含有从 file1.txt 文件中读取出的关键词的内容行,并显示每一行的行号。
命令:
grep 'linux' file1.txt
输出:
ubuntu@VM-4-14-ubuntu:~/grep$ grep 'linux' file1.txt
linux
ubuntu@VM-4-14-ubuntu:~/grep$ grep 'java' file1.txt
java
ubuntu@VM-4-14-ubuntu:~/grep$ grep 'go' file1.txt
命令:
grep 'linux' file1.txt file2.txt
输出:
ubuntu@VM-4-14-ubuntu:~/grep$ grep 'linux' file1.txt file2.txt
file1.txt:linux
file2.txt:linux
ubuntu@VM-4-14-ubuntu:~/grep$
说明:多文件时,输出查询到的信息内容行时,会把文件的命名在行最前面输出并且加上”:”作为标示符。
命令:
ps aux|grep \[s]sh
ps aux | grep ssh | grep -v "grep"
输出:
ubuntu@VM-4-14-ubuntu:~/grep$ ps aux|grep \[s]sh
root 883 0.0 0.3 12172 7404 ? Ss Jul13 0:05 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 180849 0.0 0.4 13920 8968 ? Ss 09:13 0:00 sshd: ubuntu [priv]
ubuntu 180986 0.0 0.2 14052 6040 ? S 09:14 0:00 sshd: ubuntu@pts/0
ubuntu@VM-4-14-ubuntu:~/grep$
命令:
cat file.txt |grep ^w
输出:
ubuntu@VM-4-14-ubuntu:~/grep$ cat file2.txt
windows 10
windows 7
linux
c#
java
php
python
hello word
ubuntu@VM-4-14-ubuntu:~/grep$ cat file2.txt |grep ^w
windows 10
windows 7
ubuntu@VM-4-14-ubuntu:~/grep$
命令:
cat file.txt |grep ^[^w]
输出:
ubuntu@VM-4-14-ubuntu:~/grep$ cat file2.txt |grep ^[^w]
linux
c#
java
php
python
hello word
ubuntu@VM-4-14-ubuntu:~/grep$
命令:
cat file.txt |grep on$
输出:
ubuntu@VM-4-14-ubuntu:~/grep$ cat file2.txt |grep on$
python
ubuntu@VM-4-14-ubuntu:~/grep$
命令:
cat file2.txt |grep -E "on|va"
输出:
ubuntu@VM-4-14-ubuntu:~/grep$ cat file2.txt |grep -E "on|va"
java
python
ubuntu@VM-4-14-ubuntu:~/grep$
命令:
grep '[a-z]\{7\}' *.txt
输出:
ubuntu@VM-4-14-ubuntu:~/grep$ grep '[a-z]\{7\}' *.txt
file1.txt:android
file2.txt:windows 10
file2.txt:windows 7
ubuntu@VM-4-14-ubuntu:~/grep$