Linux中的管道符与grep命令
Linux |
管道符
管道符在Linux系统中还是比较常用的,比如我们平常使用的cat
、ps
、ls
,如果想对查找的内容进行过滤,就会用到grep
命令,而管道符就是将这两个命令进行连接的一个符号,Linux会将管道符前面的内容作为后面命令的参数进行执行,举个🌰例子:
ls | grep test # 查找文件名中包含test的文件
ps -ef | grep ssh #查找所有与ssh相关的进程
示例1讲解
在上面的第一个例子中,执行ls
命令,会获得一个文件列表(如下)
a.txt b.txt c.txt test.txt test1.txt test2.txt
通过管道符之后,以上字段都会成为下一个函数(grep
)的参数,而grep
命令则用来找到这些字段里面含有test
的内容并进行显示,因此得到的结果就是:
test.txt
test1.txt
test2.txt
示例2讲解:
ps -ef
命令是列出所有的进程,Linux系统本身就包含很多进程,若是我们再启动一些其他的项目,那么进程将会特别的多,而我们可能仅需要查看一些进程,因此将ps -ef
的查询结果作为参数丢给grep
命令做一个筛选,就会获得我们想看的哪些进程内容,在我的实验机器中,该命令的结果如下:
root 958 1 0 Mar27 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 959 958 0 Mar27 ? 00:00:00 sshd: jim [priv]
jim 1045 959 0 Mar27 ? 00:00:02 sshd: jim@pts/0
root 44556 1102 0 18:26 pts/1 00:00:00 grep --color=auto ssh
可以看到一共查出来了四条内容,前三条内容为ssh进程相关的内容,而第四条却是「grep命令查找ssh关键字」所产生的进程,又做过几次试验后得知,凡是使用grep查询某个内容,都会产生一个这样的进程,因此进程若是使用grep
命令来过滤,同时又不想显示这个「grep」的进程,可以再多加一个管道符来过滤掉最后一条内容:
ps -ef | grep ssh | grep -v grep
在该命令中,我们先使用ps -ef
查找所有的进程,随后使用grep ssh
过滤出跟ssh有关的进程,最后再使用grep -v
命令去除掉含有「grep」关键字的进程,该命令查询结果如下:
root 958 1 0 Mar27 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 959 958 0 Mar27 ? 00:00:00 sshd: jim [priv]
jim 1045 959 0 Mar27 ? 00:00:02 sshd: jim@pts/0
grep 命令
grep 命令是一个非常常用的查找命令,可以用来查找字段或文件中包含的内容,因此,有以下几种用法:
1. 查找某个文件中的某个字段
grep xxx filename # grep 字段 文件名
以grep hello test.txt
为例,查找结果如下(由于CSDN中Markdown的限制,在字段中无法显示颜色,但是下方的所有hello
均为红色):
hello world
hello
2. 统计某个关键字出现的行数
在下方命令中,若某一行含有「一个或多个」我们查找的关键字,统计结果+1,注意统计的是行而不是该关键字出现的次数。
grep -c xxx filename # grep -c 字段 文件名
我创建一个名为hello.txt的文件,内容如下:
hello hellohello hello
hello hello
hello
nohello
abcd
可以看到,在该文件中,一共有4行内容包含hello
关键字,使用grep -c hello hello.txt
进行统计,结果为「4」。
除此之外,还可以过滤管道符之前命令的内容,如上文所示。