Shell对文本的搜索---grep命令
2021年4月9日
介绍
grep
是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。这也是一个我们比较常用的命令之一,好多时候虽然没通过系统的学习,但是我们还是会经常用到。当文本为标准输入时,经常和管道符 | 结合使用。
grep 命令
命令格式如下:
[root@localhost ~]# grep [选项] [模式] [文件]
选项:
-E :pattern被视为一个扩展的正则表达式;egrep
-F :pattern是一个以换行符隔开的字符串集合;fgrep不承认正则表达式
-c :计算匹配到的行数
-r :第归搜索
-n :显示匹配内容的行号
-i :不区分大小写
-v :反向选择,即选择不匹配的行
-c :只显示匹配行总数
-w :匹配整词
-x :匹配整行
-l :只显示文件名,不显示内容
-s :不显示错误信息
--color=auto :搜索匹配的关键词显示颜色
模式:
要搜索的字符串或正则表达式
文件:
即要搜索匹配的源文件或者标准输入,标准输入常用管道符 | 连接grep
- 来自文件
[root@localhost ~ ]# cat /etc/passwd | grep "root"
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
- 来自标准输入
[root@localhost ~ ]# cat /etc/passwd | grep "root"
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
当 grep
的输入既来自文件也来自标准输入时,grep
将忽略标准输入的内容不做处理,除非使用符号 - 来代表标准输入。此时,grep
会标明哪些结果来自于文件哪些来自于标准输入。
[root@localhost ~ ]# cat /etc/passwd | grep root /etc/passwd -
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
(standard input):root:x:0:0:root:/root:/bin/bash
(standard input):operator:x:11:0:operator:/root:/sbin/nologin
将 /etc/passwd
文件中,没有出现 root 和 nologin 的行打印出来
[root@localhost ~ ]# cat /etc/passwd | grep -v root | grep -v nologin
sync:x:4:65534:sync:/bin:/bin/sync
speech-dispatcher:x:111:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false
whoopsie:x:112:117::/nonexistent:/bin/false
hplip:x:118:7:HPLIP system user,,,:/var/run/hplip:/bin/false
gnome-initial-setup:x:120:65534::/run/gnome-initial-setup/:/bin/false
gdm:x:121:125:Gnome Display Manager:/var/lib/gdm3:/bin/false
karin:x:1000:1000:karin,,,:/home/karin:/bin/bash
将 /etc/passwd
文件中,结尾是 bash 的行打印出来(正则)
[root@localhost ~ ]# cat /etc/passwd | grep -E "bash$"
root:x:0:0:root:/root:/bin/bash
karin:x:1000:1000:karin,,,:/home/karin:/bin/bash
查找 sshd 进程
[root@localhost ~ ]# ps -ef | grep sshd
root 787 1 0 09:56 ? 00:00:00 /usr/sbin/sshd -D
karin 2855 2763 0 10:35 pts/0 00:00:00 grep --color=auto sshd
黄金搭档
grep
常与 sort
、find
、xargs
命令组合使用
sort 命令
用于将文本文件内容加以排序。如果未给定文件,则读取标准输入,在将排序好的数据写至标准输出。
命令格式如下:
[root@localhost ~ ]# sort [选项] [文件]
选项:
-n :按数值大小排序
-r :降序排序
-t :指定分隔符,和cut命令的-d一个作用
-k :用-t指定分隔符后,将第几段进行排序,和cut命令的-f一个作用
将 /etc/passwd
文件中每行内容以冒号为分隔符,选取第三段内容按数值大小排序
[root@localhost ~ ]# sort -n -t: -k3 /etc/passwd
find 命令
find
命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find
命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
命令格式如下:
[root@localhost ~ ]# find 路径 [搜索条件] [搜索内容]
路径:
#find命令接受一个或多个路径(paths)作为搜索范围,并在该路径下递归地搜索。
. :当前目录
~ :家目录
/ :根目录
搜索条件:
#可根据文件名、文件类型、文件大小等属性进行搜索。
-name :根据文件名(区分大小写),-iname不区分文件名大小写
-type :根据文件类型(f:文件;d:目录;l:符号链接)
-empty :检索为空的文件或目录(-type f ! -empty非空文件)
-user :根据文件或目录的归属
-mtime :根据最后一次文件内容有过更改的时间点(单位为天)
-atime :根据最后一次文件有被读取过的时间点(atime 2两天前)
-ctime :根据最后一次文件有被变更过的时间点(-2两天内;+2超过两天)
-c :根据文件大小(c:字节;k:Kb;M:Mb;G:Gb;+-表示大于小于)
-perm :根据文件权限
搜索内容:
要搜索的内容
具体请看 linux搜索命令
xargs 命令
将前一个命令的标准输出传递给下一个命令,作为它的参数,xargs
的默认命令是 echo
,空格是默认定界符;将多行输入转换为单行
命令格式如下:
[root@localhost ~ ]# [前一个命令] | xargs [选项] [后一个命令]
选项:
-n :指定一次处理的参数个数
-d :自定义参数界定符
-p :询问是否运行 later command 参数
-t :表示先打印命令,然后再执行
-i :逐项处理
xargs
与管道 |
的区别
小知识:管道 |
用来将前一个命令的标准输出传递到下一个命令的标准输入,xargs
将前一个命令的标准输出传递给下一个命令,作为它的参数。