shell 管道命令与过滤器

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 _ip:/backup/mysql/

  • mysqldump 命令用于将wike数据库备份到文件 /tmp/wikidb.backup。
  • gzip 命令用于压缩较大的数据库文件以节省磁盘空间;其中-9表示最慢的压缩速度最好的压缩效果。
  • scp 命令用于将数据库备份文件复制到 IP 地址为 remote_ip 的备份服务器的 /backup/mysql/ 目录下。其中username是登录远程服务器的用户名,命令执行后需要输入密码。

使用管道命令

mysqldump -u root -p ‘123456‘ wiki | gzip -9 | ssh _ip "cat > /backup/wikidb.gz"

  • 命令的语法紧凑并且使用简单。
  • 通过使用管道,将三个命令串联到一起就完成了远程 mysql 备份的复杂任务。
  • 从管道输出的标准错误会混合到一起。
  • ssh _ip "cat > /backup/wikidb.gz"是将上个命令中生成的文件通过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

  • ddd
  • bbb
  • CCC
  • ccc

tr a-z A-Z <os.txt | sort

  • BBB
  • CCC
  • CCC
  • DDD

2)管道与输出重定向

你也可以使用重定向操作符>或>>将管道中的最后一个命令的标准输出进行重定向,其语法如下所示:

command1 | command2 | ... | commandN > output.txt
command1 < input.txt | command2 | ... | commandN > output.txt

功能命令输出
使用 tr 命令将 os.txt 文件中的内容转化为大写,并使用 sort 命令将内容排序,使用 uniq 命令去除重复的行,最后将输出重定向到文件 ox.txt.new。

cat os.txt

  • ddd
  • bbb
  • CCC
  • ccc

tr a-z A-Z <os.txt | sort|uniq>os.txt.new

cat os.txt.new

  • BBB
  • CCC
  • DDD

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

  • _apt
  • asample
  • backup
  • bin
  • daemon

-F: 以:作为分隔符,默认分隔符是空格

‘{print $1}‘打印第一列信息

 列出当前账号最常使用的 5个命令

history | awk ‘{print $2}‘ | sort | uniq -c | sort -rn | head -5

  •      17 cat
  •      14 vim
  •      11 sudo
  •       7 ll
  •       7 cd

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 [指定字条串] [文件] 在文件中搜索字符串匹配的行并输出
-i 不区分大小写 -v 排除指定字符串

 查看系统中 HTTP 服务的进程信息

ps aux | grep httpd

  
 查找我们的程序列表中所有命令名中包含关键字 zip 的命令

ls /bin /usr/bin | sort | uniq | grep zip

  • bunzip2
  • bzip2
  • bzip2recover
  • funzip
  • gpg-zip
  • gunzip
 
 查找 /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

  • 2to3
  • 2to3-2.7
  • 2to3-3.5
  • X11
  • [
  • aclocal
  • aclocal-1.15
  • acyclic
  • add-patch
  • addpart
默认的输出行数为 10 行
 显示 ls 命令的前 5 行内容。

ls /usr/bin | head -n 5

  • 2to3
  • 2to3-2.7
  • 2to3-3.5
  • X11
  • [
 
uniq命令去掉输出中重复的行

sort testfile | uniq

  
 显示输出中各重复的行出现的次数,并按次数多少倒序显示

sort testfile | uniq -c | sort -nr

  
wc命令统计当前登录到系统的用户数

who | wc -l

2wc 命令用于统计包含在文本流中的字符数、单同数和行数
 统计当前的 Linux 系统中的进程数

ps -ef | wc -l

70