[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.过滤器的主要内容,如果未能解决你的问题,请参考以下文章