shell 管道命令与过滤器
1.管道命令的用法
将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipe)。管道使用竖线|
连接多个命令,这被称为管道符。
Linux 管道的具体语法格式如下:
command1 | command2
command1 | command2 [ | commandN... ]
当在两个命令之间设置管道时,管道符|
左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道。
这里需要注意,command1 必须有正确输出,而 command2 必须可以处理 command1 的输出结果;而且 command2 只能处理 command1 的正确输出结果,不能处理 command1 的错误信息。
2.使用管道命令的好处:
命令 | 作用 |
---|---|
3条命令来备份数据库 mysqldump -u root -p '123456' wiki > /tmp/wikidb.backup gzip -9 /tmp/wikidb.backup scp /tmp/wikidb.backup username@remote_ip:/backup/mysql/ |
|
使用管道命令 mysqldump -u root -p '123456' wiki | gzip -9 | ssh username@remote_ip "cat > /backup/wikidb.gz" |
|
3.重定向和管道的区别
乍看起来,管道也有重定向的作用,它也改变了数据输入输出的方向,那么,管道和重定向之间到底有什么不同呢?
简单地说,重定向操作符>将命令与文件连接起来,用文件来接收命令的输出;而管道符|将命令与命令连接起来,用第二个命令来接收第一个命令的输出。如下所示:
command > file
command1 | command1
4.Linux管道实例
输出 | ||
---|---|---|
将 ls 命令的输出发送到 grep 命令,查看文件 log.txt 是否存在于当前目录下 |
ls | grep log.txt |
log.txt
|
重定向管道的输出到一个文件 |
ls -al | grep log.txt >output.txt cat output.txt |
-rw-rw-r--. 1 mozhiyan mozhiyan 0 4月 15 17:26 log.txt |
显示按用户名排序后的当前登录系统的用户的信息 |
who | sort |
mozhiyan :0 2019-04-16 12:55 (:0) mozhiyan pts/0 2019-04-16 13:16 (:0) who 命令的输出将作为 sort 命令的输入,所以这两个命令通过管道连接后会显示按照用户名排序的已登录用户的信息。 |
5.管道与重定向
1)管道与输入重定向
输入重定向操作符<可以在管道中使用,以用来从文件中获取输入,其语法类似下面这样:
command1 < input.txt | command2
command1 < input.txt | command2 -option | command3
功能 | 命令 | 输出 |
---|---|---|
使用 tr 命令从 os.txt 文件中获取输入,然后通过管道将输出发送给 sort 或 uniq 等命令 |
cat os.txt
tr a-z A-Z <os.txt | sort |
|
2)管道与输出重定向
你也可以使用重定向操作符>或>>将管道中的最后一个命令的标准输出进行重定向,其语法如下所示:
command1 | command2 | ... | commandN > output.txt
command1 < input.txt | command2 | ... | commandN > output.txt
功能 | 命令 | 输出 |
---|---|---|
使用 tr 命令将 os.txt 文件中的内容转化为大写,并使用 sort 命令将内容排序,使用 uniq 命令去除重复的行,最后将输出重定向到文件 ox.txt.new。 |
cat os.txt
tr a-z A-Z <os.txt | sort|uniq>os.txt.new cat os.txt.new |
|
6.过滤器
过滤器可以概括为两点:
- 如果一个 Linux 命令是从标准输入接收它的输入数据,并在标准输出上产生它的输出数据(结果),那么这个命令就被称为过滤器。
- 过滤器通常与 Linux 管道一起使用。
常用的被作为过滤器使用的命令如下所示:
命令 | 说明 |
---|---|
awk | 用于文本处理的解释性程序设计语言,通常被作为数据提取和报告的工具。 |
cut | 用于将每个输入文件(如果没有指定文件则为标准输入)的每行的指定部分输出到标准输出。 |
grep | 用于搜索一个或多个文件中匹配指定模式的行。 |
tar | 用于归档文件的应用程序。 |
head | 用于读取文件的开头部分(默认是 10 行)。如果没有指定文件,则从标准输入读取。 |
paste | 用于合并文件的行。 |
sed | 用于过滤和转换文本的流编辑器。 |
sort | 用于对文本文件的行进行排序。 |
split | 用于将文件分割成块。 |
strings | 用于打印文件中可打印的字符串。 |
tac | 与 cat 命令的功能相反,用于倒序地显示文件或连接文件。 |
tail | 用于显示文件的结尾部分。 |
tee | 用于从标准输入读取内容并写入到标准输出和文件。 |
tr | 用于转换或删除字符。 |
uniq | 用于报告或忽略重复的行。 |
wc | 用于打印文件中的总行数、单词数或字节数。 |
7.过滤器举栗
功能 | 命令 | 输出 | 知识点 | |
---|---|---|---|---|
awk与管道结合 | 查看系统中的所有的账号名称,并按名称的字母顺序排序 |
awk -F: '{print $1}' /etc/passwd | sort|head -5 |
|
-F: 以:作为分隔符,默认分隔符是空格 '{print $1}'打印第一列信息 |
列出当前账号最常使用的 5个命令 |
history | awk '{print $2}' | sort | uniq -c | sort -rn | head -5
|
|
uniq -c 在每列旁边显示该行重复出现的次数。 sort -rn 按照数值的大小反向排序 |
|
显示当前系统的总内存大小,单位为 KB |
free | grep Mem | awk '{print $2}' |
2029860 |
free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer | |
cut 与管道命令结合 | 查看系统中登录 Shell 是/bin/bash的用户名和对应的用户主目录的信息 |
grep "bin/bash" /etc/passwd|cut -d : -f1,6
|
root:/root roaddb:/home/roaddb asample:/home/asample |
/ctc/passwd 文件用来存放用户账号的信息,文件中的每一行会记录一个账号的信息,每个字段之间用冒号分隔,第一个字段即是账号的账户名,第六个字段就是账号的主目录的路径。
|
查看当前机器的CPU类型 |
cat /proc/cpuinfo |grep name|cut -d : -f 2|uniq |
Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz | ||
查看当前目录下的子目录数 |
ls -l|cut -c 1|grep d|wc -l |
4 | 命令cut -c 1 是截取每行的第一个字符 |
|
grep命令 | 查看系统日志文件中的错误信息 |
grep -i "error:" /var/log/messages | less |
grep -iv [指定字条串] [文件] 在文件中搜索字符串匹配的行并输出 |
|
查看系统中 HTTP 服务的进程信息 |
ps aux | grep httpd |
|||
查找我们的程序列表中所有命令名中包含关键字 zip 的命令 |
ls /bin /usr/bin | sort | uniq | grep zip |
|
||
查找 /etc 目录下所有包含 IP 地址的文件 |
find /etc -type f -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} \; |
|||
tar命令 | 复制一个目录的整体结构 |
tar cf - /home/mozhiyan | ( cd /backup/; tar xf - ) |
||
跨网络地复制一个目录的整体结构 |
tar cf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xf - )" |
|||
跨网络地压缩复制一个目录的整体结构 |
tar czf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xzf - )" |
|||
检査 tar 归档文件的大小,单位为字节 |
cd /; tar cf - etc | wc -c |
|||
检查 tar 归档文件压缩为 tar.gz 归裆文件后所占的大小 |
tar czf - etc.tar | wc -c |
|||
检查 tar 归档文件压缩为 tar.bz2 归裆文件后所占的大小 |
tar cjf - etc.tar | wc -c |
|||
head 命令 | 显示 ls 命令的前 10 行输出 |
ls /usr/bin | head |
|
默认的输出行数为 10 行 |
显示 ls 命令的前 5 行内容。 |
ls /usr/bin | head -n 5 |
|
||
uniq命令 | 去掉输出中重复的行 |
sort testfile | uniq |
||
显示输出中各重复的行出现的次数,并按次数多少倒序显示 |
sort testfile | uniq -c | sort -nr |
|||
wc命令 | 统计当前登录到系统的用户数 |
who | wc -l |
2 | wc 命令用于统计包含在文本流中的字符数、单同数和行数 |
统计当前的 Linux 系统中的进程数 |
ps -ef | wc -l |
70 |