[Linux Shell学习系列十二]管道和过滤器-2.过滤器

D24

将几个命令通过管道符组合在一起就形成一个管道。通常,通过这种方式使用的命令就被称为过滤器。过滤器会获取输入,通过某种方式修改其内容,然后输出。

简单的将过滤器特点概括为:

1)如果一个Linux命令是从标准输入接收它的输入数据,并在标准输出上产生它的输出数据(结果),那么这个命令就被称为过滤器。

2)过滤器通常与Linux管道一起使用。

下面介绍常用的被作为过滤器使用的命令。

 

1. 在管道中使用awk命令

awk命令用于文本处理的解释性程序设计语言,通常被作为数据提取和报告的工具。(在14章详细介绍)

示例:

#查看系统中的所有的帐号名称,并按名称的字母顺序排序
$ awk -F: '{print $1}' /etc/passwd | sort

#列出当前帐号最常使用的10个命令
#history命令将输出通过管道发送到awk命令;
#awk命令默认使用空格作为分隔符,将history的输出分为两列,并将第二列内容作为输出通过管道发送到sort命令;
#使用sort命令排序后,再将输出通过管道发送到uniq命令;
#使用uniq命令统计了历史命令重复出现的次数;
#用sort命令将uniq命令的输出按照重复次数从高到低排序;
#使用head命令默认列出前10个的信息
$ history | awk '{print $2}' | sort | uniq -c |sort -rn | head

#显示当前系统的总内存大小,单位KB
$ free | grep Mem | awk '{print $2}'

 

2. 在管道中使用cut命令

cut命令用于将每个输入文件(如果没有指定文件则为标准输入)的每行的指定部分输出到标准输出。

示例:

#查看系统中登录Shell是/bin/bash的用户名和对应的用户主目录的信息
#/etc/passwd中以:分隔的第一列和第六列分别是用户名和主目录
$ grep "/bin/bash" /etc/passwd | cut -d: -f1,6

#查看当前机器的CPU类型
#/proc/cpuinfo中包含name的行,取用:分隔的第2列内容,最后用uniq去掉重复的行
$ cat /proc/cpuinfo | grep name | cut -d: -f2 | uniq

#查看当前目录下的子目录数
#用ls -l列出当前目录文件和子目录(每行的第一个字符表示文件类型);
#用cut截取每行的第一个字符;
#用grep d过滤文件类型是目录的行;
#用wc -l统计行数,即目录个数
$ ls -l | cut -c 1 | grep d | wc -l

 

3. 在管道中使用grep命令

grep命令用于搜索一个或多个文件中匹配指定模式的行,在管道中比较常用的一个命令。

示例:

#查看系统日志文件中的错误信息
$ grep -i "error:" /var/log/messages | less

#查看系统中http服务的进程信息
$ ps auxwww | grep httpd

#列出当前目录下的第一层子目录的详细信息
#^d表示以d开头
$ ls -al /proc | grep "^d"

#查找程序列表中所有命令名中包含关键字zip的命令
$ ls /bin /usr/bin | sort | uniq | grep zip

#查看系统安装的kernel版本及相关的kernel软件包
$ rpm -qa | grep kernel

#查找/etc目录下所有包含IP地址的文件
$ find /etc -type f -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} \;

 

4. 在管道中使用tar命令

tar命令用于归档文件,是Linux系统中最常用的打包文件的程序。

示例:

#使用tar命令复制一个目录的整体结构
$ tar cf - testdir | ( cd /backup/; tar xf - )

#跨网络地复制一个目录的整体结构
$ tar cf - testdir | ssh remote-host "( cd /backup/; tar xf - )"

#跨网络地压缩复制一个目录的整体结构
$ tar czf - testdir | 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

 

5. 在管道中使用head命令

head命令用于读取文件的开头部分(默认是10行)。如果没有指定文件,则从标准输入读取。

示例:

#显示ls命令的前10行输出
$ ls /usr/bin | head

#显示ls命令的前5行内容
$ ls / | head -n 5

 

6. 在管道中使用paste命令

paste命令用于合并文件的行,当然,也可以通过管道接收其他命令的输出,并对其内容进行相应的合并处理。

示例:

#通过管道使用paste命令将两个文件输出的行进行合并
$ cat os.txt
redhat
suse
centos
ubuntu
solaris
centos
suse

$ cat number.txt 
1
2
3
4
5
6
7

$ cat number.txt | paste -d, os.txt - #合并行,os.txt在前
redhat,1
suse,2
centos,3
ubuntu,4
solaris,5
centos,6
suse,7

$ cat number.txt | paste -d, - os.txt #合并行,number.txt在前
1,redhat
2,suse
3,centos
4,ubuntu
5,solaris
6,centos
7,suse


#通过管道使用paste命令将ls命令的输出分成4列显示
#分割符号是@
$ ls
a.ln  a.ls  a.txt  b.txt  c.txt

$ ls | paste -d@ - - -
a.ln@a.ls@a.txt
b.txt@c.txt@

 

7. 在管道中使用sed命令

sed命令是流编辑器(stream editor)的简称,是用于过滤和转换文本的流编辑器。(第14章详细介绍)

示例:

#替换打印输出的文本中的内容
$ echo front | sed 's/front/back/'
back

#显示/etc/bashrc文件中除第3-10行以外的内容
$ cat -n /etc/bashrc | sed '3,10d'

#只显示文件/etc/bashrc文件中第3-10行的内容
$ cat -n /etc/bashrc | sed -n '3,10p'

 

8.在管道中使用sort命令

sort命令用于对文本文件的行进行排序,当然,也可以通过管道对其他命令输出的行进行排序。

示例:

#将ls命令列出的文件列表按照文件大小排序
$ ls -al | sort -r -n -k5

#将ps命令的输出按照PID的大小排序
$ ps auxw| sort

 

9. 在管道中使用split命令

split命令用于将文件分割成块,同样,也可以通过管道将其他命令输出的内容分割成指定大小的块,并存入指定前缀的文件中。

示例:

#将ls命令的输出按每5行为一块,存入文件名前缀为lsstudy的文件中
$ ls -al | split -l 5 - lsstudy

#将backup目录按每5兆大小进行打包压缩,生成的压缩包文件名前缀为backup.tar.gz
$ tar czf - backup | split -b 5m - backup.tar.gz

 

10. 在管道中使用strings命令

strings命令用于打印文件中的可打印字符串,常与grep命令配合使用,在二进制文件中查找字符串。

#查找uptime命令中的GLIBC字符串
$ strings /usr/bin/uptime | grep GLIBC

#打印系统的BIOS信息(至少32个字符长度的字符序列),需要root权限
# dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 32| less

 

11. 在管道中使用tail命令

tail命令用于打印文件的最后几行,同样,也可以通过管道显示其他命令输出的最后几行内容。

示例:

#显示ls命令输出的最后5行内容
$ ls -al | tail -n 5 

#显示/etc/passwd文件中UID最高的用户的信息
$ sort /etc/passwd -t: -k3 -n | tail -n1 

 

12. 在管道中使用tee命令

tee命令用于(在同一时间)存储和查看任意其他命令的输出。使用tee命令可以从一个输入流读取输入,并分隔输出流到两个重定向,所以输出既显示在屏幕(标准输出)上也同样重定向到一个文件中。

#使用ls命令显示目录列表,并同时重定向到文件/tmp/ls.output中
$ ls /etc/cron.daily | tee /tmp/ls.output

#在管道中的不同阶段存储命令的中间结果
#ls列出目录内容
#tee将输出存储到文件/tmp/stage1.txt中
#grep命令过滤出以0开头的行
#tee将过滤的输出存储到文件/tmp/stage2.txt中
#sort命令过滤的输出使用-r选项进行反向排序
$ ls /etc/cron.daily | tee /tmp/stage1.txt | grep ^0 | tee /tmp/stage2.txt | sort -r

#将命令的输出存储到多个文件中
#tee将输出存储到两个文件,内容相同
$ ls /etc/cron.daily | tee file1.txt file2.txt | sort -r

#将命令的输出追加到一个文件中
$ ls /etc/cron.daily | grep ^0 | tee file1.txt | sort -r | tee -a file1.txt 

#重复复制标准输出
#每使用一个符号-,tee命令会将管道中的前一个命令的输出复制到标准输出一次
$ echo abc | tee -                    
abc
abc

$ echo abc | tee - -
abc
abc
abc

 

13. 在管道中使用tr命令

tr命令用于转换和删除字符。

#将所有的空白字符转换为制表符
$ echo "This is for testing" | tr [:space:] '\t'
This is for testing

#删除前一命令输出中的所有数字
$ echo "My uid is 12107" | tr -d [:digit:]
My uid is

$ echo "My uid is 12107" | tr -d '0-9'
My uid is

#将前一命令输出中的所有字符转换为大写
$ echo "linux" | tr 'a-z' 'A-Z'
LINUX

 

14. 在管道中使用uniq命令

uniq命令用于报告或删除重复的行。

$ cat testfile 
This line occurs once.
This line occurs twice.
This line occurs twice.
This line occurs 3 times.
This line occurs 3 times.
This line occurs 3 times.

#去掉输出中重复的行
$ sort testfile | uniq
This line occurs 3 times.
This line occurs once.
This line occurs twice.

#显示输出中重复的行出现的次数,并按次数多少倒序显示
$ sort testfile | uniq -c | sort -nr
      3 This line occurs 3 times.
      2 This line occurs twice.
      1 This line occurs once.

#统计测试文件中每个单词出现的次数,并按出现次数的多少反向排序
#sed把.和,删除,按空格换行,即每个单词一行
#tr把大写字母都转为小写
#sort做排序
#uniq -c统计重复行出现的次数
#sort -nr按数量倒序排列
$
sed -e 's/\.//g' -e 's/\,//g' -e 's/ /\n/g' testfile | tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr 6 this 6 occurs 6 line 3 times 3 3 2 twice 1 once

 

15. 在管道中使用wc命令

wc命令用于统计包含在文本流中的字符数、单词数和行数。

示例:

#统计当前登录到系统的用户数
$ who | wc -l

#统计当前Linux系统的进程数
$ ps -ef | wc -l

 

本节结束

posted @ 2020-06-08 13:49  workingdiary  阅读(665)  评论(0)    收藏  举报