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

Posted workingdiary

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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 

 

以上是关于[Linux Shell学习系列十二]管道和过滤器-2.过滤器的主要内容,如果未能解决你的问题,请参考以下文章

linux shell脚本学习xargs命令使用详解

学习二十二

24 shell 管道命令与过滤器

Linux学习(二十一)Shell基础认识shell命令历史命令补全别名通配符管道符与前后台控制

shell 管道命令与过滤器

linux学习第十二周总结